Laravel 中创建 Zip 压缩文件并提供下载的实现方法


Posted in PHP onApril 02, 2019

如果您需要您的用户支持多文件下载的话,最好的办法是创建一个压缩包并提供下载。下面通过本文给大家看下在 Laravel 中的实现。

事实上,这不是关于 Laravel 的,而是和 PHP 的关联更多,我们准备使用从 PHP 5.2 以来就存在的 ZipArchive 类 ,如果要使用,需要确保php.ini 中的 ext-zip 扩展开启。

任务 1: 存储用户的发票文件到 storage/invoices/aaa001.pdf

下面是代码展示:

$zip_file = 'invoices.zip'; // 要下载的压缩包的名称
// 初始化 PHP 类
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$invoice_file = 'invoices/aaa001.pdf';
// 添加文件:第二个参数是待压缩文件在压缩包中的路径
// 所以,它将在 ZIP 中创建另一个名为 "storage/" 的路径,并把文件放入目录。
$zip->addFile(storage_path($invoice_file), $invoice_file);
$zip->close();
// 我们将会在文件下载后立刻把文件返回原样
return response()->download($zip_file);

例子很简单,对吗?

*

任务 2: 压缩 全部 文件到 storage/invoices 目录中

Laravel 方面不需要有任何改变,我们只需要添加一些简单的 PHP 代码来迭代这些文件。

$zip_file = 'invoices.zip';
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);

$path = storage_path('invoices');
$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
foreach ($files as $name => $file)
{
 // 我们要跳过所有子目录
 if (!$file->isDir()) {
  $filePath  = $file->getRealPath();

  // 用 substr/strlen 获取文件扩展名
  $relativePath = 'invoices/' . substr($filePath, strlen($path) + 1);

  $zip->addFile($filePath, $relativePath);
 }
}
$zip->close();
return response()->download($zip_file);

到这里基本就算完成了。你看,你不需要任何 Laravel 的扩展包来实现这个压缩方式。

PS:下面看下laravel从入门到精通之 文件处理 压缩/解压zip

1:将此软件包添加到所需软件包列表中composer.json

"chumper/zipper": "1.0.x"

2:命令行执行

composer update

3:配置app/config/app.php

add to providers Chumper\Zipper\ZipperServiceProvider::class
add to aliases 'Zipper' => Chumper\Zipper\Zipper::class

4:遍历文件打包至压缩包

$files = Array();
    foreach ($student as $key => $data) {
      if ($data->photopath != null) {
        $check = glob(storage_path('photo/' . $data->photopath));
        $files = array_merge($files, $check);
      }
    }
 Zipper::make(storage_path() . '/systemImg/' . $name)->add($files)->close();

5:读取压缩包文件

Zipper::make( storage_path() . '/photo/photos')->extractTo(storage_path('temp'));
 $zip = new \ZipArchive();//方法2:流处理,新建一个ZipArchive的对象
        $logFiles = Zipper::make($path)->listFiles('/\.png$/i');
        if ($zip->open($path) === TRUE) {
          foreach ($logFiles as $key) {
            $stream = $zip->getStream($key);
            $str = stream_get_contents($stream); //这里注意获取到的文本编码
            $name = iconv("utf-8", "gb2312//IGNORE", $key);
            file_put_contents(storage_path() . '\temp\\' . $name, $str);
          }
        } else {
          return '{"statusCode":"300", "message":"上传失败,请检查照片"}';
        }

总结

以上所述是小编给大家介绍的Laravel 中创建 Zip 压缩文件并提供下载的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP文件上传实例详解!!!
Jan 02 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
php实现word转html的方法
Jan 22 PHP
PHP批量删除jQuery操作
Jul 23 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 #PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 #PHP
phpstorm 配置xdebug的示例代码
Mar 31 #PHP
PHP文件后缀不强制为.php方法
Mar 31 #PHP
PHP中md5()函数的用法讲解
Mar 30 #PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 #PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 #PHP
You might like
PHP面向对象教程之自定义类
2014/06/10 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
django+echart数据动态显示的例子
2019/08/12 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
经理管理专业自荐信范文
2013/12/31 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
报到证丢失证明
2014/01/11 职场文书
工程技术员岗位职责
2014/03/02 职场文书
授权委托书样本
2014/09/25 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
铁人观后感
2015/06/16 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Python MNIST手写体识别详解与试练
2021/11/07 Python