ThinkPHP使用ZipArchive實現批量打包下載文件


上傳的圖片、Word、PDF較多時,批量打包下載方便快捷,下面我叫大家使用ZipArchive實現批量打包下載文件。

//下載
public function to_download()
{
    $item = ["C:/Users/Administrator/Downloads/1.jpg","C:/Users/Administrator/Downloads/4.jpg"];
    //批量下載
    $zip = new \ZipArchive;
    //目錄
    $path = "./temp/";
    //壓縮包的名稱
    $filename = 'temp.zip';
    $zip_file = $path . $filename;

    //打開一個zip文件;\ZipArchive::OVERWRITE覆蓋,\ZipArchive::CREATE創建
    $zip->open($zip_file, \ZipArchive::OVERWRITE|\ZipArchive::CREATE);

    //創建臨時目錄(沒有temp目錄的需要先手動創建,或用mkdir創建)
    if (!is_dir($path)) {
        if ((mkdir($path, 0777, true)) === false) {
            return '臨時目錄創建失敗!';
        }
    }
    //把圖片一張一張加進去壓縮
    foreach ($item as $key => $value) {
        //將文件添加到壓縮包;第一個參數將文件寫入zip,第二個參數是文件的重命名(同時防止多級目錄出現)
        $zip->addFile($value,"$key.jpg");
    }
    //關閉ziparchive
    $zip->close();

    //可以直接重定向下載
//        header('Location:'.$zip_file);

    //或者輸出下載
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header('Content-disposition: attachment; filename='.basename($zip_file)); //獲取文件名;basename:返回路徑中的文件名部分,
    header("Content-Type: application/force-download");//強制下載
    header("Content-Transfer-Encoding: binary");//二進制傳輸
    header('Content-Length: '. filesize($zip_file)); //告訴瀏覽器,文件大小
    readfile($zip_file);

    //下載后刪除臨時目錄
    if (is_dir($path)){//is_dir目錄存在返回 TRUE
        $this->delDirAndFile($path);
    }
}

下載后刪除臨時目錄:

//刪除目錄
protected function delDirAndFile( $dirName ){
    if($handle=opendir($dirName)){
        while(false!==($item=readdir($handle))){
            if($item!="."&&$item!=".."){
                if(is_dir("$dirName/$item")){
                    $this->delDirAndFile("$dirName/$item");
                }else{
                    unlink("$dirName/$item");
                }
            }
        }
        closedir($handle);
        rmdir($dirName);
    }
}

 

 

常遇到的問題:

1、創建臨時文件失敗

這是因為$zip->open,沒有找到臨時目錄,我們需要先手動創建,或用mkdir創建:

    //創建臨時目錄(沒有temp目錄的需要先手動創建,或用mkdir創建)
    if (!is_dir('./temp/')) {
        if ((mkdir($path, 0777, true)) === false) {
            return '臨時目錄創建失敗!';
        }
    }

2、ZipArchive::open()的錯誤使用

ZipArchive::open(),參數2是ZipArchive::CREATE,第一次會創建一個目錄,但接着使用里面的壓縮包每下載一次就疊加一次,所以這個適合第一次創建使用的;
ZipArchive::OVERWRITE的時候,當目標文件已經存在時,程序會生成一個新的同名文件覆蓋原來的文件,但是,當這個文件不存在時,ZipArchive::open()將返回數字9,錯誤信息是“No such file.”。
如果想要實現文件存在時自動覆蓋文件不存在時自動創建,那么應該同時使用ZipArchive::OVERWRITE和ZipArchive::CREATE。

$zip->open('wuxiancheng.cn.zip',ZipArchive::OVERWRITE|ZipArchive::CREATE);

3、ZipArchive壓縮zip文件多級目錄

$zip->addFile一般會出現多級目錄,解決的方法就是添加文件后加個[路徑]文件名 :

$zip->addFile ($dir.'test.zip','images1.jpg');//一級
/*壓縮后的效果如
*    test.zip
*        images1.zip
*/
$zip->addFile ($dir.'test.zip','images/images1.jpg');//二級
/*壓縮后的效果如
*    test.zip
*        imgages        //目錄
*            images1.zip
*/

 

 

 

 

ZipArchive方法詳細:https://nobige.cn/post/20180808-phpZipArchiveNdir/

php中文手冊:https://www.php.cn/manual/view/1501.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM