1. 程式人生 > >PHP生成ZIP壓縮檔案

PHP生成ZIP壓縮檔案


PHP生成ZIP壓縮檔案


/*
 * 生成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' => '壓縮完成'];
}