[TOC] #### 1. PHP 生成壓縮包 --- 下面是 PHP 將本地文件生成壓縮包的核心代碼,在此基礎(chǔ)上可進行擴展封裝 ```php // 壓縮包名稱 $name = 'test.zip'; // 創(chuàng)建壓縮包對象 $zip = new ZipArchive; // 打開壓縮包 $zip->open($name, ZipArchive::CREATE); // 本地文件絕對路徑 $path = __DIR__ . '/Index.php'; // 將文件添加到壓縮包中,此時已經(jīng)生成了壓縮包文件 $zip->addFile($path, basename($path)); // 將文本內(nèi)容寫入文件,再將文件添加到壓縮包中 $zip->addFromString('1.txt', '你好,世界!'); $zip->addFromString('2.txt', 'hello world !'); // 關(guān)閉壓縮包 $zip->close(); ``` ##### $zip->open() 官方文檔 : [https://www.php.net/manual/en/ziparchive.open.php](https://www.php.net/manual/en/ziparchive.open.php) 第一個參數(shù)表示處理的 zip 文件名,第二個參數(shù)表示處理模式,語法格式如下所示: ```php $zip->open(string $filename, int $flags = 0); ``` 當?shù)诙€參數(shù)為 `ZipArchive::CREATE` 時 壓縮包文件不存在時會生成壓縮包; 如果壓縮包存在,則在壓縮包中進行追加文件,而不是直接覆蓋原壓縮包 ```php $zip->open($name, ZipArchive::CREATE); ``` 當?shù)诙€參數(shù)為 `ZipArchive::OVERWRITE` 時 壓縮包文件存在時可以正常處理,會生成新的壓縮包文件,將原來的壓縮包直接覆蓋掉;原壓縮包不存在時程序則會報錯 ```php $zip->open($name, ZipArchive::OVERWRITE); // 如果原壓縮包文件不存在,在執(zhí)行 addFile() 向壓縮包中添加文件時會拋出錯誤 $zip->addFile(); // 錯誤如下所示 // ZipArchive::addFile(): Invalid or uninitialized Zip object ``` 那么 **$zip->open()** 第二個參數(shù)處理模式應(yīng)該使用哪個呢 ? 我們需要自己做判斷選擇合適的處理模式 ```php if ($zip->open($name, ZipArchive::OVERWRITE) === ZipArchive::ER_NOENT) { $zip->open($name, ZipArchive::CREATE); } ``` ##### $zip->addFromString() 將字符串內(nèi)容寫入文件,然后添加到壓縮包 ```php $zip->addFromString(string $name, string $content); // 使用示例 $zip->addFromString('1.txt', '你好,世界!'); $zip->addFromString('2.txt', 'hello world !'); ``` #### 2. PHP 讀取壓縮包 --- ```javascript // 壓縮包 $name = 'test.zip'; // 創(chuàng)建壓縮包操作對象 $zip = new ZipArchive; // 打開壓縮包 $result = $zip->open($name); if ($result === ZipArchive::ER_NOENT) { throw new \Exception("壓縮包不存在"); } else if ($result !== true) { throw new \Exception("壓縮包打開失敗"); } // 將壓縮包文件解壓到指定目錄 $zip->extractTo('unzip'); // 在 TP6 中建議解壓到 runtime 目錄下 // $zip->extractTo(runtime_path() . 'unzip'); // 如果需要處理壓縮包中的文件,遍歷解壓縮目錄下的文件進行處理即可 // 釋放壓縮包對象 $zip->close(); ```