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和ACCESS写聊天室(五)
Oct 09 PHP
PHP简介
Oct 09 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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下把数组保存为文件格式的实例应用
2010/02/08 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
JavaScript中filter的用法实例分析
2019/02/27 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
详解爬虫被封的问题
2019/04/23 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
从python读取sql的实例方法
2020/07/21 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
小学数学教学反思
2014/02/02 职场文书
物理教学随笔感言
2014/02/22 职场文书
经理任命书模板
2014/06/06 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
合理化建议书
2015/02/04 职场文书