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 相关文章推荐
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 PHP
PHP中的日期处理方法集锦
Jan 02 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
php PDO异常处理详解
Nov 20 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
Laravel学习教程之路由模块
Aug 18 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP操作Redis数据库常用方法示例
Aug 25 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 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
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
用Python 执行cmd命令
2020/12/18 Python
python中PyQuery库用法分享
2021/01/15 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
港湾网络笔试题
2014/04/19 面试题
大学生创业计划书的格式要求
2013/12/29 职场文书
人事科岗位职责范本
2014/03/02 职场文书
合伙经营协议书
2014/04/18 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
市场策划求职信
2014/08/07 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
任命书格式模板
2015/09/22 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang