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 相关文章推荐
FCKeditor的安装(PHP)
Jan 13 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
PHP实现货币换算的方法
Nov 29 PHP
Yii2如何批量添加数据
May 17 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
PHP的mysqli_stat()函数讲解
Jan 23 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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缓存类代码(附详细说明)
2011/06/09 PHP
php 注释规范
2012/03/29 PHP
深入解析php之apc
2013/05/15 PHP
Yii rules常用规则示例
2016/03/15 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
测试工程师岗位职责
2013/11/28 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
优秀大学生自荐信
2014/06/09 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server