上傳的圖片、Word、PDF較多時,批量打包下載方便快捷,下面我叫大家使用ZipArchive實現批量打包下載文件。
//下載 public function to_download() { $item = ["C:/Users/Administrator/Downloads/1.jpg","C:/Users/Administrator/Downloads/4.jpg"]; //批量下載 $zip = new \ZipArchive; //目錄 $path = "./temp/"; //壓縮包的名稱 $filename = 'temp.zip'; $zip_file = $path . $filename; //打開一個zip文件;\ZipArchive::OVERWRITE覆蓋,\ZipArchive::CREATE創建 $zip->open($zip_file, \ZipArchive::OVERWRITE|\ZipArchive::CREATE); //創建臨時目錄(沒有temp目錄的需要先手動創建,或用mkdir創建) if (!is_dir($path)) { if ((mkdir($path, 0777, true)) === false) { return '臨時目錄創建失敗!'; } } //把圖片一張一張加進去壓縮 foreach ($item as $key => $value) { //將文件添加到壓縮包;第一個參數將文件寫入zip,第二個參數是文件的重命名(同時防止多級目錄出現) $zip->addFile($value,"$key.jpg"); } //關閉ziparchive $zip->close(); //可以直接重定向下載 // header('Location:'.$zip_file); //或者輸出下載 header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename='.basename($zip_file)); //獲取文件名;basename:返回路徑中的文件名部分, header("Content-Type: application/force-download");//強制下載 header("Content-Transfer-Encoding: binary");//二進制傳輸 header('Content-Length: '. filesize($zip_file)); //告訴瀏覽器,文件大小 readfile($zip_file); //下載后刪除臨時目錄 if (is_dir($path)){//is_dir目錄存在返回 TRUE $this->delDirAndFile($path); } }
下載后刪除臨時目錄:
//刪除目錄 protected function delDirAndFile( $dirName ){ if($handle=opendir($dirName)){ while(false!==($item=readdir($handle))){ if($item!="."&&$item!=".."){ if(is_dir("$dirName/$item")){ $this->delDirAndFile("$dirName/$item"); }else{ unlink("$dirName/$item"); } } } closedir($handle); rmdir($dirName); } }
常遇到的問題:
1、創建臨時文件失敗
這是因為$zip->open,沒有找到臨時目錄,我們需要先手動創建,或用mkdir創建:
//創建臨時目錄(沒有temp目錄的需要先手動創建,或用mkdir創建) if (!is_dir('./temp/')) { if ((mkdir($path, 0777, true)) === false) { return '臨時目錄創建失敗!'; } }
2、ZipArchive::open()的錯誤使用
ZipArchive::open(),參數2是ZipArchive::CREATE,第一次會創建一個目錄,但接着使用里面的壓縮包每下載一次就疊加一次,所以這個適合第一次創建使用的;
ZipArchive::OVERWRITE的時候,當目標文件已經存在時,程序會生成一個新的同名文件覆蓋原來的文件,但是,當這個文件不存在時,ZipArchive::open()將返回數字9,錯誤信息是“No such file.”。
如果想要實現文件存在時自動覆蓋文件不存在時自動創建,那么應該同時使用ZipArchive::OVERWRITE和ZipArchive::CREATE。
$zip->open('wuxiancheng.cn.zip',ZipArchive::OVERWRITE|ZipArchive::CREATE);
3、ZipArchive壓縮zip文件多級目錄
$zip->addFile一般會出現多級目錄,解決的方法就是添加文件后加個[路徑]文件名 :
$zip->addFile ($dir.'test.zip','images1.jpg');//一級 /*壓縮后的效果如 * test.zip * images1.zip */ $zip->addFile ($dir.'test.zip','images/images1.jpg');//二級 /*壓縮后的效果如 * test.zip * imgages //目錄 * images1.zip */
ZipArchive方法詳細:https://nobige.cn/post/20180808-phpZipArchiveNdir/