PHP实现文件压缩、文件解压缩及文件下载代码

PHP实现文件压缩、文件解压缩及文件下载代码片段记录。

  1. /**
  2.  * 文件打包下载
  3.  * @param string $downloadZip 打包后下载的文件名
  4.  * @param array $list 打包文件组
  5.  * @return void
  6.  */
  7. function addZip($downloadZip,$list){
  8.     // 初始化Zip并打开
  9.     $zip = new \ZipArchive();
  10.     // 初始化
  11.     $bool = $zip->open($downloadZip, \ZipArchive::CREATE|\ZipArchive::OVERWRITE);
  12.     if($bool === TRUE) {
  13.         foreach ($list as $key => $val) {
  14.             // 把文件追加到Zip包并重命名
  15.             // $zip->addFile($val[0]);
  16.             // $zip->renameName($val[0], $val[1]);
  17.             // 把文件追加到Zip包
  18.             $zip->addFile($valbasename($val));
  19.         }
  20.     }else{
  21.         exit('ZipArchive打开失败,错误代码:' . $bool);
  22.     }
  23.     // 关闭Zip对象
  24.     $zip->close();
  25.     // 下载Zip包
  26.     header('Cache-Control: max-age=0');
  27.     header('Content-Description: File Transfer');
  28.     header('Content-disposition: attachment; filename=' . basename($downloadZip));
  29.     header('Content-Type: application/zip');                     // zip格式的
  30.     header('Content-Transfer-Encoding: binary');                 // 二进制文件
  31.     header('Content-Length: ' . filesize($downloadZip));          // 文件大小
  32.     readfile($downloadZip);
  33.     exit();
  34. }
  35. /**
  36.  * 解压压缩包
  37.  * @param string $zipName 要解压的压缩包
  38.  * @param string $dest 解压到指定目录
  39.  * @return boolean
  40.  */
  41. function unZip($zipName,$dest){
  42.     //检测要解压压缩包是否存在
  43.     if(!is_file($zipName)) {
  44.         return false;
  45.     }
  46.     //检测目标路径是否存在
  47.     if(!is_dir($dest)) {
  48.         mkdir($dest, 0777, true);
  49.     }
  50.     // 初始化Zip并打开
  51.     $zip = new \ZipArchive();
  52.     // 打开并解压
  53.     if($zip->open($zipName)) {
  54.         $zip->extractTo($dest);
  55.         $zip->close();
  56.         return true;
  57.     }else{
  58.         return false;
  59.     }
  60. }
  61. /**
  62.  * 文件下载
  63.  * @param string $filename 要下载的文件
  64.  * @param string $refilename 下载后的命名
  65.  * @return void
  66.  */
  67. function download($filename,$refilename = null){
  68.     // 验证文件
  69.     if(!is_file($filename)||!is_readable($filename)) {
  70.         return false;
  71.     }
  72.     // 获取文件大小
  73.     $fileSize = filesize($filename);
  74.     // 重命名
  75.     !isset($refilename) && $refilename = $filename;
  76.     // 字节流
  77.     header('Content-Type:application/octet-stream');
  78.     header('Accept-Ranges: bytes');
  79.     header('Accept-Length: ' . $fileSize);
  80.     header('Content-Disposition: attachment;filename='.basename($refilename));
  81.     // 校验是否限速(超过1M自动限速,同时下载速度设为1M)
  82.     $limit = 1 * 1024 * 1024;
  83.     if$fileSize <= $limit ) {
  84.         readfile($filename);
  85.     }else{
  86.         // 读取文件资源
  87.         $file = fopen($filename, 'rb');
  88.         // 强制结束缓冲并输出
  89.         ob_end_clean();
  90.         ob_implicit_flush();
  91.         header('X-Accel-Buffering: no');
  92.         // 读取位置标
  93.         $count = 0;
  94.         // 下载
  95.         while (!feof($file) && $fileSize - $count > 0){
  96.             $res = fread($file$limit);
  97.             $count += $limit;
  98.             echo $res;
  99.             sleep(1);
  100.         }
  101.         fclose($file);
  102.     }
  103.     exit();
  104. }

 

 

波波
你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!