/* * 壓縮文件 * */ function zip($files){ $zipName = 'download.zip'; $zip = new \ZipArchive;//使用本類,linux需開啓zlib,windows需取消php_zip.dll前的註釋 /* * 經過ZipArchive的對象處理zip文件 * $zip->open這個方法若是對zip文件對象操做成功,$zip->open這個方法會返回TRUE * $zip->open這個方法第一個參數表示處理的zip文件名。 * 這裏重點說下第二個參數,它表示處理模式 * ZipArchive::OVERWRITE 老是以一個新的壓縮包開始,此模式下若是已經存在則會被覆蓋。 * ZIPARCHIVE::CREATE 若是不存在則建立一個zip壓縮包,若存在系統就會往原來的zip文件裏添加內容。 * * 這裏不得不說一個大坑。 * 個人應用場景是須要每次都是建立一個新的壓縮包,若是以前存在,則直接覆蓋,不要追加 * so,根據官方文檔和參考其餘代碼,$zip->open的第二個參數我應該用 ZipArchive::OVERWRITE * 問題來了,當這個壓縮包不存在的時候,會報錯:ZipArchive::addFile(): Invalid or uninitialized Zip object * 也就是說,經過個人測試發現,ZipArchive::OVERWRITE 不會新建,只有當前存在這個壓縮包的時候,它纔有效 * 因此個人解決方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) * * 以上總結基於我當前的運行環境來講 * */ if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) { exit('沒法打開文件,或者文件建立失敗'); } foreach($files as $val){ //$attachfile = $attachmentDir . $val['filepath']; //獲取原始文件路徑 if(file_exists($val)){ //addFile函數首個參數若是帶有路徑,則壓縮的文件裏包含的是帶有路徑的文件壓縮 //若不但願帶有路徑,則須要該函數的第二個參數 $zip->addFile($val, basename($val));//第二個參數是放在壓縮包中的文件名稱,若是文件可能會有重複,就須要注意一下 } } $zip->close();//關閉 if(!file_exists($zipName)){ exit("沒法找到文件"); //即便建立,仍有可能失敗 } return '打包成功'; } /* * 獲取文件的路徑及名稱 * */ function traverse($path) { global $filePath;//獲得外部定義的數組 $current_dir = opendir($path); //opendir()返回一個目錄句柄,失敗返回false while (($file = readdir($current_dir)) !== false) { //readdir()返回打開目錄句柄中的一個條目 $sub_dir = $path . DIRECTORY_SEPARATOR . $file; //構建子目錄路徑 if ($file == '.' || $file == '..') { continue; } else if (is_dir($sub_dir)) { //若是是目錄,進行遞歸 traverse($sub_dir); //嵌套遍歷子文件夾 } else { //若是是文件,直接輸出路徑和文件名 $filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路徑賦值給數組 } } return $filePath; }