[TOC] #### 1. PHP 生成压缩包 --- 下面是 PHP 将本地文件生成压缩包的核心代码,在此基础上可进行扩展封装 ```php // 压缩包名称 $name = 'test.zip'; // 创建压缩包对象 $zip = new ZipArchive; // 打开压缩包 $zip->open($name, ZipArchive::CREATE); // 本地文件绝对路径 $path = __DIR__ . '/Index.php'; // 将文件添加到压缩包中,此时已经生成了压缩包文件 $zip->addFile($path, basename($path)); // 将文本内容写入文件,再将文件添加到压缩包中 $zip->addFromString('1.txt', '你好,世界!'); $zip->addFromString('2.txt', 'hello world !'); // 关闭压缩包 $zip->close(); ``` ##### $zip->open() 官方文档 : [https://www.php.net/manual/en/ziparchive.open.php](https://www.php.net/manual/en/ziparchive.open.php) 第一个参数表示处理的 zip 文件名,第二个参数表示处理模式,语法格式如下所示: ```php $zip->open(string $filename, int $flags = 0); ``` 当第二个参数为 `ZipArchive::CREATE` 时 压缩包文件不存在时会生成压缩包; 如果压缩包存在,则在压缩包中进行追加文件,而不是直接覆盖原压缩包 ```php $zip->open($name, ZipArchive::CREATE); ``` 当第二个参数为 `ZipArchive::OVERWRITE` 时 压缩包文件存在时可以正常处理,会生成新的压缩包文件,将原来的压缩包直接覆盖掉;原压缩包不存在时程序则会报错 ```php $zip->open($name, ZipArchive::OVERWRITE); // 如果原压缩包文件不存在,在执行 addFile() 向压缩包中添加文件时会抛出错误 $zip->addFile(); // 错误如下所示 // ZipArchive::addFile(): Invalid or uninitialized Zip object ``` 那么 **$zip->open()** 第二个参数处理模式应该使用哪个呢 ? 我们需要自己做判断选择合适的处理模式 ```php if ($zip->open($name, ZipArchive::OVERWRITE) === ZipArchive::ER_NOENT) { $zip->open($name, ZipArchive::CREATE); } ``` ##### $zip->addFromString() 将字符串内容写入文件,然后添加到压缩包 ```php $zip->addFromString(string $name, string $content); // 使用示例 $zip->addFromString('1.txt', '你好,世界!'); $zip->addFromString('2.txt', 'hello world !'); ``` #### 2. PHP 读取压缩包 --- ```javascript // 压缩包 $name = 'test.zip'; // 创建压缩包操作对象 $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(); ```