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