PHP生成ZIP壓縮檔案
阿新 • • 發佈:2019-01-05
/* * 生成zip壓縮檔案 * $sourceDir:被壓縮的資料夾或檔案 * $outFileName:輸出的壓縮檔名稱 * */ function createZipResources($sourceDir, $outFileName = '', $filesName) { if ($outFileName == '') { $outFileName = time().'.zip'; } else { $outFileName = $outFileName.'.zip'; } $fileNames = []; //判斷需要被壓縮的目標是檔案還是資料夾 if (is_file($sourceDir)) { $fileNames['file'][basename($sourceDir)] = $sourceDir; } else { $fileNames = read_all_dir($sourceDir); } if (!array_key_exists('file', $fileNames) && !array_key_exists('dir', $fileNames)) { $fileNames['dir'][basename($sourceDir)] = []; } // 生成檔案 $zip = new ZipArchive (); // 使用本類,linux需開啟zlib,windows需取消php_zip.dll前的註釋 if ($zip->open ($outFileName, ZIPARCHIVE::CREATE ) !== TRUE) { exit ( '無法開啟檔案,或者檔案建立失敗' ); } $fileNameArr = $fileNames; $toFolderZip = function ($fileNameArr, &$zip, $base = '') use (&$toFolderZip) { foreach ( $fileNameArr as $key => $value ) { if ($key == 'file') { foreach ($value as $fileName => $filePath) { $fileName = urldecode($fileName); if ($base == '') { $zip->addFile($filePath, $fileName); } else { $zip->addFile($filePath, $base.'/'.$fileName); } } } if ($key == 'dir') { foreach ($value as $folderName => $folderObject) { $folderName = urldecode($folderName); if ($base == '') { $zip->addEmptyDir($folderName); $based = $folderName; } else { $based = $base.'/'.$folderName; $zip->addEmptyDir($based); } $toFolderZip($folderObject, $zip, $based); } } } }; $toFolderZip($fileNameArr, $zip); $zip->close(); // 關閉 header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename='.$filesName.'.zip'); //檔名 header("Content-Type: application/zip"); //zip格式的 header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進位制檔案 header('Content-Length: '. filesize($outFileName)); //告訴瀏覽器,檔案大小 return @readfile($outFileName); //return ['status'=>'YES', 'info' => '壓縮完成']; }