i漂泊

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3739|回复: 0

使用PHP自带zlib函数实现PHP文件打包下载zip

[复制链接]
TA的礼物信息
  • 收到:0
  • 送出:2
发表于 2016-3-22 15:07:51 | 显示全部楼层 |阅读模式
  1. /**
  2. * 遍历获取文件列表
  3. * @author 51漂泊<www.51piaobo.com>
  4. * @param $dir - 路径
  5. * @param $infiles Array  - 包含的文件名
  6. * @return 返回文件列表
  7. */
  8. function HaoTeamFileLists($dir, $infiles) {
  9.     $arr = array();
  10.     $dirHandle = @opendir($dir);
  11.     if ($dirHandle) {
  12.         while (($file = readdir($dirHandle)) !== false) {
  13.             $flag = false;
  14.             if ($file === '.' || $file === '..') {
  15.                 continue;
  16.             }
  17.             $tmp = realpath($dir . DIRECTORY_SEPARATOR . $file);
  18.             if (is_dir($tmp)) {
  19.                 $retArr = HaoTeamFileLists($tmp, $infiles);
  20.                 if (!empty($retArr)) {
  21.                     foreach ($retArr as $key => $value) {
  22.                         $arr[] = $value;
  23.                     }
  24.                 }
  25.             } else {
  26.                 if (isset($infiles)) {
  27.                     if (is_array($infiles)) {
  28.                         foreach ($infiles as $infile) {
  29.                             if (strstr($tmp, $infile)) {
  30.                                 $arr[] = $tmp;
  31.                             }
  32.                         }
  33.                     } else {
  34.                         if (strstr($tmp, $infiles)) {
  35.                             $arr[] = $tmp;
  36.                         }
  37.                     }
  38.                 } else {
  39.                     $arr[] = $tmp;
  40.                 }
  41.             }
  42.         }
  43.         closedir($dirHandle);
  44.     }
  45.     return $arr;
  46. }
复制代码
  1. //获取列表
  2. $datalist = HaoTeamFileLists('../');
  3. $filename = "./bak.zip"; //最终生成的文件名(含路径)
  4. if (!file_exists($filename)) {
  5. //重新生成文件
  6.     $zip = new ZipArchive(); //使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
  7.     if ($zip->open($filename, ZIPARCHIVE::CREATE) !== TRUE) {
  8.         exit('无法打开文件,或者文件创建失败');
  9.     }
  10.     foreach ($datalist as $val) {
  11.         if (file_exists($val)) {
  12.             $zip->addFile($val, basename($val)); //第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
  13.         }
  14.     }
  15.     $zip->close(); //关闭
  16. }
  17. if (!file_exists($filename)) {
  18.     exit("无法找到文件"); //即使创建,仍有可能失败。。。。
  19. }
  20. header("Cache-Control: public");
  21. header("Content-Description: File Transfer");
  22. header('Content-disposition: attachment; filename=' . basename($filename)); //文件名
  23. header("Content-Type: application/zip"); //zip格式的
  24. header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
  25. header('Content-Length: ' . filesize($filename)); //告诉浏览器,文件大小
  26. @readfile($filename);
复制代码
PHP ZipArchive是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP扩展已经开启,具体开启方法这里就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流。这里整理一下利用php zipArchive进行文件的压缩与解压缩的常用的示例供参考。
一、解压缩zip文件
  1. $zip=new ZipArchive;//新建一个ZipArchive的对象
  2.         if($zip->open('test.zip')===TRUE){
  3.         $zip->extractTo('images');//假设解压缩到在当前路径下images文件夹内
  4.         $zip->close();//关闭处理的zip文件
  5. }
复制代码
二、将文件压缩成zip文件
  1. $zip=new ZipArchive;
  2. if($zip->open('test.zip',ZipArchive::OVERWRITE)===TRUE){
  3.         $zip->addFile('image.txt');//假设加入的文件名是image.txt,在当前路径下
  4.         $zip->close();
  5. }
复制代码
三、文件追加内容添加到zip文件
  1. $zip=new ZipArchive;
  2. $res=$zip->open('test.zip',ZipArchive::CREATE);
  3. if($res===TRUE){
  4.         $zip->addFromString('test.txt','file content goes here');
  5.         $zip->close();
  6.         echo 'ok';
  7. }else{
  8.         echo 'failed';
  9. }
复制代码
四、将文件夹打包成zip文件
  1. function addFileToZip($path,$zip){
  2.         $handler=opendir($path); //打开当前文件夹由$path指定。
  3.         while(($filename=readdir($handler))!==false){
  4.                 if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
  5.                         if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
  6.                                 addFileToZip($path."/".$filename, $zip);
  7.                         }else{ //将文件加入zip对象
  8.                                 $zip->addFile($path."/".$filename);
  9.                         }
  10.                 }
  11.         }
  12.         @closedir($path);
  13. }
  14. $zip=new ZipArchive();
  15. if($zip->open('images.zip', ZipArchive::OVERWRITE)=== TRUE){
  16.         addFileToZip('images/', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
  17.         $zip->close(); //关闭处理的zip文件
  18. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|IPiaoBo Inc. ( 渝ICP备17002826号 )

GMT+8, 2024-4-25 23:51 , Processed in 0.061776 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表