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将数据导入到Foxmail的实现代码
Sep 05 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php命名空间学习详解
Feb 27 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
php实现搜索类封装示例
Mar 31 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
phpquery中文手册
Mar 18 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python插入排序算法的实现代码
2013/11/21 Python
详解Python的Django框架中的模版相关知识
2015/07/15 Python
python根据京东商品url获取产品价格
2015/08/09 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python实现顺序表的简单代码
2018/09/28 Python
flask-restful使用总结
2018/12/04 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
公司司机岗位职责
2014/02/07 职场文书
党员党性分析材料
2014/02/17 职场文书
门店业绩提升方案
2014/06/08 职场文书
个人工作能力自我评价
2015/03/05 职场文书
内勤岗位职责范本
2015/04/13 职场文书
Java tomcat手动配置servlet详解
2021/11/27 Java/Android