我目前在try 使用ZipArchive类在PHP中解压缩一个使用Deflate64压缩的ZIP文件时遇到了一个问题.对于常规的Deflate压缩,提取过程似乎工作得很好,但在处理Deflate64时遇到了困难.

以下是使用常规Deflate压缩成功解压的示例:

$zip = new ZipArchive();
$zip->open('deflate.zip');
$zip->extractTo('/tmp/test_extract');
(bool) true

但是,当try 解压使用Deflate64压缩的ZIP文件时,该过程失败:

$zip = new ZipArchive();
$zip->open('deflate64.zip');
$zip->extractTo('/tmp/test_extract');
(bool) false

此外,使用ZipArchive::isCompressionMethodSupported判断是否支持Deflate64压缩将返回FALSE:

ZipArchive::isCompressionMethodSupported(ZipArchive::CM_DEFLATE64);
(bool) false

另一方面,支持常规Deflate压缩:

ZipArchive::isCompressionMethodSupported(ZipArchive::CM_DEFLATE);
(bool) true

我正在联系社区,询问是否有已知的解决方案或解决方法来支持在PHP的ZipArchive类中使用Deflate64压缩来提取ZIP文件.任何解决这个问题的见解或代码片段都将不胜感激.

首先感谢您的帮助!

推荐答案

看起来libzip团队只有don't want to support deflate64个,你可以使用zlib来逐个放大每个文件.

for($i = 0; $i < $zip->numFiles; $i++){
    $st = $zip->statIndex($i);
    if($st['comp_method'] == ZipArchive::CM_DEFLATE64){
        $data = $zip->getFromIndex($i, 0, ZipArchive::FL_COMPRESSED);
        file_put_contents("/tmp/test_extract/$st[name]", gzinflate($data));
    }
}

注意:您需要自己创建子文件夹.

Php相关问答推荐

419注册期间Laravel 11中的错误

如果再次调用SESSION_START(),会话.gc-max是否会重新启动?或者它是从第一次创建会话开始计算的?

Symfony/Panther Web抓取不适用于登录后的内容(云功能)

Symfony装置加载:try 从命名空间加载类";ClassUtils";Doctrine\Common\Util";

仅在WooCommerce管理订单视图上显示订单项自定义元数据

Laravel:如何展平多维Eager 加载的集合

使用ESI的Symfony Sulu清漆

我有一个显示记录的表格,每行在最右边有两个按钮.如何才能以正确的顺序获得表的值?

使用与OpenSSL命令行兼容的AES-256-CTR为大型文件创建php代码OpenSSL加密

升级到PHP 8.2后无法删除cURL Cookie文件

为WooCommerce中存储一些数据的购物车项目添加复选框

在 Heroku 上部署 Sylius - 路由不正确

在 mysql 上的 PDO 中启用自动提交并将自动提交设置为关闭

WooCommerce订单支付页面上的附加支付订单按钮

在PHP WordPress插件中使用变量连接路径时的问题解决方法

将变量从中间件传递到控制器 Laravel

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

在 WooCommerce 结帐后更新用户元字段

在 DomPDF 和 Laravel 中使用内联 css

Laravel 响应 html 默认页面忽略控制器