2021-11-15補充說明,由於PHP8.0對於new ZipArchive的寫法有改變,以下方法無法於PHP8.0中使用,如需使用PHP8.0開發Xoops模組zip下載功能的請參考這篇工作心得
方法如下:
PHP-CODE-把以下程式碼放到模組的function.php裡面,於要觸發下載的PHP檔中引入function.php
//下載檔案壓縮ZIP格式function
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); //刪除暫存檔
}
在於按鈕中帶連結或是透過JS的window.location.href指向要觸發下載的PHP檔
呼叫zipArchivefunction()函數建立ZIP下載
1、檔案路徑一定要用XOOPS_ROOT_PATH而不是XOOPS_URL,XOOPS_ROOT_PATH是抓絕對路徑也就是D:/xampp/htdocs/......
2、zipArchivefunction函數共需傳入三個參數
->$url //下載原始檔案路徑
->$zipname //輸出的zip檔名
->$temp //設定暫存資料夾路徑及暫存檔
$namefile="test.pdf"; //下載原始檔名(可改成資料庫中讀取的檔名變數)
$url="".XOOPS_ROOT_PATH."/uploads/modulesname/file/".$namefile.""; //下載原始檔案路徑+原始檔名
$zipname = date("Y-m-d-H-i-s") .'.zip'; //輸出的zip檔名 (以當前時間產生檔名可自行修改)
$temp="".XOOPS_ROOT_PATH."/uploads/modulesname/file/temp/".$zipname.""; //設定暫存資料夾路徑及暫存zip檔名(存放暫存產生的zip檔後程式會自動刪除,檔案要有777寫入權限)
zipArchivefunction($url=$url,$zipname=$zipname,$temp=$temp);
設定完成後實際來測試一下,點擊檔案下載,產生下載框:
點選儲存會產生ZIP檔,儲存到本地端資料夾
下載回來的ZIP檔也能順利解壓縮,不會出現什麼檔案損毀的警訊,完成收工,有需要的朋友參考看看!!
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言