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学习 变量使用总结
Mar 24 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
PHP5各个版本的新功能和新特性总结
Mar 16 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
php使用PDO方法详解
Dec 27 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
如何打开php的gd2库
Feb 09 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
php实现微信小程序授权登录功能(实现流程)
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进行MySQL删除记录操作代码
2008/06/07 PHP
php 学习资料零碎东西
2010/12/04 PHP
php学习之 数组声明
2011/06/09 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
python实现清屏的方法
2015/04/30 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
HTML5注册页面示例代码
2014/03/27 HTML / CSS
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
四好少年事迹材料
2014/01/12 职场文书
学习张林森心得体会
2014/09/10 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
《去年的树》教学反思
2016/02/18 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
Redis如何实现分布式锁
2021/08/23 Redis