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数组应用之比较两个时间的相减排序
Aug 18 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
php use和include区别总结
Oct 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实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Java及python正则表达式详解
2017/12/27 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python 格式化输出百分号的方法
2019/01/20 Python
python同步windows和linux文件
2019/08/29 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
植物选择:Botanic Choice
2017/02/15 全球购物
高中教师先进事迹材料
2014/08/22 职场文书
关于环保的活动方案
2014/08/25 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
神秘岛读书笔记
2015/07/01 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python