php獲取全部文件並壓縮

/*
 *  壓縮文件
 * */
function zip($files){
    $zipName = 'download.zip';
    $zip = new \ZipArchive;//使用本類,linux需開啓zlib,windows需取消php_zip.dll前的註釋
    /*
     * 經過ZipArchive的對象處理zip文件
     * $zip->open這個方法若是對zip文件對象操做成功,$zip->open這個方法會返回TRUE
     * $zip->open這個方法第一個參數表示處理的zip文件名。
     * 這裏重點說下第二個參數,它表示處理模式
     * ZipArchive::OVERWRITE 老是以一個新的壓縮包開始,此模式下若是已經存在則會被覆蓋。
     * ZIPARCHIVE::CREATE 若是不存在則建立一個zip壓縮包,若存在系統就會往原來的zip文件裏添加內容。
     *
     * 這裏不得不說一個大坑。
     * 個人應用場景是須要每次都是建立一個新的壓縮包,若是以前存在,則直接覆蓋,不要追加
     * so,根據官方文檔和參考其餘代碼,$zip->open的第二個參數我應該用 ZipArchive::OVERWRITE
     * 問題來了,當這個壓縮包不存在的時候,會報錯:ZipArchive::addFile(): Invalid or uninitialized Zip object
     * 也就是說,經過個人測試發現,ZipArchive::OVERWRITE 不會新建,只有當前存在這個壓縮包的時候,它纔有效
     * 因此個人解決方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)
     *
     * 以上總結基於我當前的運行環境來講
     * */
    if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {
        exit('沒法打開文件,或者文件建立失敗');
    }
    foreach($files as $val){
        //$attachfile = $attachmentDir . $val['filepath']; //獲取原始文件路徑
        if(file_exists($val)){
            //addFile函數首個參數若是帶有路徑,則壓縮的文件裏包含的是帶有路徑的文件壓縮
            //若不但願帶有路徑,則須要該函數的第二個參數
            $zip->addFile($val, basename($val));//第二個參數是放在壓縮包中的文件名稱,若是文件可能會有重複,就須要注意一下
        }
    }
    $zip->close();//關閉
    if(!file_exists($zipName)){
        exit("沒法找到文件"); //即便建立,仍有可能失敗
    }
    return '打包成功';
}

/*
 *  獲取文件的路徑及名稱
 * */
function traverse($path)
{
    global $filePath;//獲得外部定義的數組
    $current_dir = opendir($path);    //opendir()返回一個目錄句柄,失敗返回false
    while (($file = readdir($current_dir)) !== false) {    //readdir()返回打開目錄句柄中的一個條目
        $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //構建子目錄路徑
        if ($file == '.' || $file == '..') {
            continue;
        } else if (is_dir($sub_dir)) {    //若是是目錄,進行遞歸
            traverse($sub_dir); //嵌套遍歷子文件夾
        } else {    //若是是文件,直接輸出路徑和文件名
            $filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路徑賦值給數組
        }
    }
    return $filePath;
}
相關文章
相關標籤/搜索