Thinkphp5用PHP扩展类ZipArchive批量打包压缩文件,并下载

文章代码环境:

PHP5.6

ThinkPHP V5.0.13

nginx/1.6.2

先贴代码

 

 
  1. //压缩文件

  2. function zip(){

  3. $files = array('upload/qrcode/1/100001.jpg','upload/qrcode/1/100002.jpg');

  4. //$files = array('upload/qrcode/1/1.jpg');

  5. $zipName = 'upload/qrcode/1/download.zip';

  6. $zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释

  7. /*

  8. * 通过ZipArchive的对象处理zip文件

  9. * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE

  10. * $zip->open这个方法第一个参数表示处理的zip文件名。

  11. * 这里重点说下第二个参数,它表示处理模式

  12. * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。

  13. * ZIPARCHIVE::CREATE 如果不存在则创建一个zip压缩包,若存在系统就会往原来的zip文件里添加内容。

  14. *

  15. * 这里不得不说一个大坑。

  16. * 我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加

  17. * so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE

  18. * 问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object

  19. * 也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效

  20. * 所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)

  21. *

  22. * 以上总结基于我当前的运行环境来说

  23. * */

  24. if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {

  25. exit('无法打开文件,或者文件创建失败');

  26. }

  27. foreach($files as $val){

  28. //$attachfile = $attachmentDir . $val['filepath']; //获取原始文件路径

  29. if(file_exists($val)){

  30. //addFile函数首个参数如果带有路径,则压缩的文件里包含的是带有路径的文件压缩

  31. //若不希望带有路径,则需要该函数的第二个参数

  32. $zip->addFile($val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下

  33. }

  34. }

  35. $zip->close();//关闭

  36.  
  37. if(!file_exists($zipName)){

  38. exit("无法找到文件"); //即使创建,仍有可能失败

  39. }

  40.  
  41. //如果不要下载,下面这段删掉即可,如需返回压缩包下载链接,只需 return $zipName;

  42. header("Cache-Control: public");

  43. header("Content-Description: File Transfer");

  44. header('Content-disposition: attachment; filename='.basename($zipName)); //文件名

  45. header("Content-Type: application/zip"); //zip格式的

  46. header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件

  47. header('Content-Length: '. filesize($zipName)); //告诉浏览器,文件大小

  48. @readfile($zipName);

  49. }

 



代码可以直接放在控制器里,也可以直接放在模型里,当然也可以直接放到common.php公共函数里。

 

总之,ZipArchive属于php的扩展类,不用单独添加类库。

这里不得不说一个大坑。
我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加
so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE
问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object
也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)

报错提示:

 

另外,如果用的不是thinkPHP框架,只需要把

 

 new \ZipArchive
 if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {

两行中的 Zip前的反斜杠去掉即可

 

 

 new ZipArchive
 if ($zip->open($zipName, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE)!==TRUE) {

其他不变。

 

 

本文内容参考了:

http://blog.csdn.net/dreamboycx/article/details/49304951

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值