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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
php access 数据连接与读取保存编辑数据的实现代码
May 12 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
smarty表格换行实例
Dec 15 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
用php实现分页效果的示例代码
Dec 10 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
帅气的琦玉老师
2020/03/02 日漫
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
php多重接口的实现方法
2015/06/20 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
js实现图片上传到服务器和回显
2020/01/19 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
物流管理专业大学生自荐信
2013/10/04 职场文书
物业管理大学生个人的自我评价
2013/10/10 职场文书
专升本个人自我评价
2013/12/22 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
心理咨询承诺书
2014/05/20 职场文书
班组长安全工作职责
2014/07/15 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
个性与发展自我评价
2015/03/06 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle