先來看PHP實現文件及文件夾的zip壓縮
這里使用PHP擴展的ZipArchive類,在使用之前要將php.ini文件中的zlib.output_compression設置為On
代碼如下:
public function addFileToZip($path, $current, $zip) { // 打開文件夾資源 $handler = opendir($path); // 循環讀取文件夾內容 while(($filename = readdir($handler)) !== false) { // 過濾掉Linux系統下的.和..文件夾 if ($filename != '.' && $filename != '..') { // 文件指針當前位置指向的如果是文件夾,就遞歸壓縮 if (is_dir($path.'/'.$filename)) { $this->addFileToZip($path.'/'.$filename, $filename, $zip); }else { // 為了在壓縮文件的同時也將文件夾壓縮,可以設置第二個參數為文件夾/文件的形式,文件夾不存在自動創建壓縮文件夾 $zip->addFile($path.'/'.$filename, $current.'/'.$filename); } } } @closedir($handler); } $zipName = 'your zip file path'; // 如果壓縮文件不存在,就創建壓縮文件 if (! is_file($zipName)) { $fp = fopen($zipName, 'w'); fclose($fp); } $zip = new \ZipArchive(); // OVERWRITE選項表示每次壓縮時都覆蓋原有內容,但是如果沒有那個壓縮文件的話就會報錯,所以事先要創建好壓縮文件 // 也可以使用CREATE選項,此選項表示每次壓縮時都是追加,不是覆蓋,如果事先壓縮文件不存在會自動創建 if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
$current = 'uplaods/'; // 你要壓縮的文件的主目錄 $compress->addFileToZip($path, $current, $zip); $zip->close(); }else { exit('下載失敗!'); }
在壓縮完之后我們可能還需要下載,而且下載完之后還可以刪除壓縮文件。
代碼如下:
class Download { public static function downloadFile($filePath,$showName) { if (is_file($filePath)) { //打開文件 $file = fopen($filePath,"r"); //返回的文件類型 Header("Content-type: application/octet-stream"); //按照字節大小返回 Header("Accept-Ranges: bytes"); //返回文件的大小 Header("Accept-Length: ".filesize($filePath)); //這里設置客戶端的彈出對話框顯示的文件名 Header("Content-Disposition: attachment; filename=".$showName); //一次性將數據傳輸給客戶端 //echo fread($file, filesize($filePath)); //一次只傳輸1024個字節的數據給客戶端 //向客戶端回送數據 $buffer=1024;// //判斷文件是否讀完 while (!feof($file)) { //將文件讀入內存 $file_data = fread($file, $buffer); //每次向客戶端回送1024個字節的數據 echo $file_data; } return true; }else { return false; } } } // 調用這個方法的部分 // 下載壓縮后的文件 if (! Download::downloadFile($zipName, $showName)) { return "<script>alert('下載失敗!')</script>"; }else { @unlink($zipName); }
以上的代碼基本可以實現簡單的打包下載功能。