之前寫過一篇【Xoops做一個php下載檔案自動壓縮成ZIP格式方法】工作心得,不過那方法在PHP8.0中無法使用,原因是new ZipArchive必須要先有實體的zip檔才能實體化,否則會出現
※php8.0修改過後的new ZipArchive code
※檔案路徑一定要用XOOPS_ROOT_PATH而不是XOOPS_URL,XOOPS_ROOT_PATH是抓絕對路徑也就是C:/xampp/htdocs/......
ValueError: ZipArchive::open(): Argument #1 ($filename) cannot be empty
錯誤訊息,必須修改new ZipArchive寫法在$zip->open之前就先建立一個暫存的zip檔,這樣後面的程式就沒問題了,修改方法如下
※原本的new ZipArchive code
function zipArchivefunction($url="",$zipname="",$temp=""){
//$url 檔案原始路徑+檔名
//$zipname 檔案名稱
//$temp 檔案暫存路徑+檔名
/********利用ZipArchive產生壓縮檔************/
$zip = new ZipArchive;
$zip->open($temp, ZipArchive::CREATE);
//$zip->addFile($dir); //添加檔案 (若有大量檔案可使用迴圈)
$new_filename = substr($url, strrpos($url, '/') + 1); //重新定義壓縮檔路徑
$zip->addFile($url, $new_filename);
$zip->close();
/********使用header命令php下載zip檔************/
header('Content-Type: application/zip');
//指定類型
header("Content-type: ".filetype("$temp"));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$zipname."");
//輸出下載的內容。
readfile($temp);
unlink($temp); //刪除暫存檔
}
//$url 檔案原始路徑+檔名
//$zipname 檔案名稱
//$temp 檔案暫存路徑+檔名
/********利用ZipArchive產生壓縮檔************/
$zip = new ZipArchive;
$zip->open($temp, ZipArchive::CREATE);
//$zip->addFile($dir); //添加檔案 (若有大量檔案可使用迴圈)
$new_filename = substr($url, strrpos($url, '/') + 1); //重新定義壓縮檔路徑
$zip->addFile($url, $new_filename);
$zip->close();
/********使用header命令php下載zip檔************/
header('Content-Type: application/zip');
//指定類型
header("Content-type: ".filetype("$temp"));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$zipname."");
//輸出下載的內容。
readfile($temp);
unlink($temp); //刪除暫存檔
}
function zipArchivefunction($url="",$zipname=""){
//$url 檔案原始路徑+檔名
//$zipname 檔案名稱
$file = tempnam("/tmp", "zip"); //創建一個zip臨時文件
$zip = new ZipArchive;
$res = $zip->open($file, ZipArchive::OVERWRITE);
if ($res) {
$new_filename = substr($url, strrpos($url, '/') + 1); //重新定義壓縮檔路徑
$zip->addFile($url, $new_filename);
}
$zip->close();
/********使用header命令php下載zip檔************/
header('Content-Type: application/zip');
//指定文件或目錄的類型
header("Content-type: ".filetype($file));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$zipname."");
//輸出下載的內容。
readfile($file);
unlink($file ); //刪除暫存檔
主要差別在於php8.0新增加了一個tempnam()函數創建一個zip臨時文件,這樣$zip->open就不會出現cannot be empty的問題,經測試檔案也能正常的產生為zip檔打包下載,有需要的朋友參考看看!!
//$url 檔案原始路徑+檔名
//$zipname 檔案名稱
$file = tempnam("/tmp", "zip"); //創建一個zip臨時文件
$zip = new ZipArchive;
$res = $zip->open($file, ZipArchive::OVERWRITE);
if ($res) {
$new_filename = substr($url, strrpos($url, '/') + 1); //重新定義壓縮檔路徑
$zip->addFile($url, $new_filename);
}
$zip->close();
/********使用header命令php下載zip檔************/
header('Content-Type: application/zip');
//指定文件或目錄的類型
header("Content-type: ".filetype($file));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$zipname."");
//輸出下載的內容。
readfile($file);
unlink($file ); //刪除暫存檔
}
其他設定說明請參考原本的【Xoops做一個php下載檔案自動壓縮成ZIP格式方法】工作心得($temp變數不使用)
留言
張貼留言