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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
php 判断数组是几维数组
Mar 20 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
php封装的单文件(图片)上传类完整实例
Oct 18 PHP
Laravel实现autoload方法详解
May 07 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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初学者头痛的十四个问题
2006/07/12 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
Javascript实现的分页函数
2007/02/07 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
layui table 参数设置方法
2018/08/14 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
python读写文件操作示例程序
2013/12/02 Python
利用Psyco提升Python运行速度
2014/12/24 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
python操作yaml说明
2020/04/08 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
python搜索算法原理及实例讲解
2020/11/18 Python
会计找工作求职信范文
2013/12/09 职场文书
会计辞职信范文
2014/01/15 职场文书
社区志愿者培训方案
2014/06/10 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
监护人证明
2015/06/19 职场文书
欢迎新生标语2015
2015/07/16 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP