PHP 生成压缩包、读取压缩包

1. PHP 生成压缩包

下面是 PHP 将本地文件生成压缩包的核心代码,在此基础上可进行扩展封装

复制代码
  1. // 压缩包名称
  2. $name = 'test.zip';
  3. // 创建压缩包对象
  4. $zip = new ZipArchive;
  5. // 打开压缩包
  6. $zip->open($name, ZipArchive::CREATE);
  7. // 本地文件绝对路径
  8. $path = __DIR__ . '/Index.php';
  9. // 将文件添加到压缩包中,此时已经生成了压缩包文件
  10. $zip->addFile($path, basename($path));
  11. // 将文本内容写入文件,再将文件添加到压缩包中
  12. $zip->addFromString('1.txt', '你好,世界!');
  13. $zip->addFromString('2.txt', 'hello world !');
  14. // 关闭压缩包
  15. $zip->close();
$zip->open()

官方文档 : PHP: ZipArchive::open - Manual

第一个参数表示处理的 zip 文件名,第二个参数表示处理模式,语法格式如下所示:

复制代码
  1. $zip->open(string $filename, int $flags = 0);

当第二个参数为 ZipArchive::CREATE

压缩包文件不存在时会生成压缩包; 如果压缩包存在,则在压缩包中进行追加文件,而不是直接覆盖原压缩包

复制代码
  1. $zip->open($name, ZipArchive::CREATE);

当第二个参数为 ZipArchive::OVERWRITE

压缩包文件存在时可以正常处理,会生成新的压缩包文件,将原来的压缩包直接覆盖掉;原压缩包不存在时程序则会报错

复制代码
  1. $zip->open($name, ZipArchive::OVERWRITE);
  2. // 如果原压缩包文件不存在,在执行 addFile() 向压缩包中添加文件时会抛出错误
  3. $zip->addFile();
  4. // 错误如下所示
  5. // ZipArchive::addFile(): Invalid or uninitialized Zip object

那么 $zip->open() 第二个参数处理模式应该使用哪个呢 ? 我们需要自己做判断选择合适的处理模式

复制代码
  1. if ($zip->open($name, ZipArchive::OVERWRITE) === ZipArchive::ER_NOENT) {
  2. $zip->open($name, ZipArchive::CREATE);
  3. }
$zip->addFromString()

将字符串内容写入文件,然后添加到压缩包

复制代码
  1. $zip->addFromString(string $name, string $content);
  2. // 使用示例
  3. $zip->addFromString('1.txt', '你好,世界!');
  4. $zip->addFromString('2.txt', 'hello world !');
2. PHP 读取压缩包

复制代码
  1. // 压缩包
  2. $name = 'test.zip';
  3. // 创建压缩包操作对象
  4. $zip = new ZipArchive;
  5. // 打开压缩包
  6. $result = $zip->open($name);
  7. if ($result === ZipArchive::ER_NOENT) {
  8. throw new \Exception("压缩包不存在");
  9. } else if ($result !== true) {
  10. throw new \Exception("压缩包打开失败");
  11. }
  12. // 将压缩包文件解压到指定目录
  13. $zip->extractTo('unzip');
  14. // 在 TP6 中建议解压到 runtime 目录下
  15. // $zip->extractTo(runtime_path() . 'unzip');
  16. // 如果需要处理压缩包中的文件,遍历解压缩目录下的文件进行处理即可
  17. // 释放压缩包对象
  18. $zip->close();
相关推荐
lulu1216544078几秒前
大模型API聚合平台技术架构深度对比:六大平台协议转换、路由调度与安全治理全解析 - 微元算力(weytoken)
java·人工智能·安全·架构·ai编程
可乐ea3 分钟前
【Spring Boot + MyBatis|第4篇】MyBatis 动态 SQL:if、where、foreach 使用详解
java·spring boot·后端·sql·mybatis
記億揺晃着的那天10 分钟前
Windows 通过 Java 获取可用端口的一个坑:Hyper-V 保留端口导致 UDP 绑定失败
java·windows·udp
组合缺一11 分钟前
SolonCode(编码智能体)支持鸿蒙 PC
java·华为·ai·ai编程·harmonyos·solon·soloncode
小bo波12 分钟前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
00后程序员张15 分钟前
Jenkins 自动上传 IPA 到 App Store 把发布步骤融入 CI/CD
android·ios·小程序·https·uni-app·iphone·webview
折哥的程序人生 · 物流技术专研17 分钟前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
一个儒雅随和的男子20 分钟前
sentinel底层原理剖析以及实战优化
java·网络·sentinel
Gary Studio23 分钟前
复杂 SoC(RK3568)PCB 布局的五步
android·linux·硬件
两年半的个人练习生^_^26 分钟前
JMM 进阶:彻底理解 synchronized 实现原理
java·开发语言