【问题标题】:Corrupt extraction with ZipArchive in PHP在 PHP 中使用 ZipArchive 进行损坏的提取
【发布时间】:2020-03-09 13:40:06
【问题描述】:

我有一个 PHP 脚本必须解压缩一些上传文件。上传是打包的文件夹,基本上是带有自定义扩展名的 zip 文件。

我在一台机器上打包了一些 zip 文件时遇到了问题,但在另一台机器上打包的同一个文件夹却没有问题。在这两种情况下,压缩都是使用同一个 Java 库完成的。

这是预期的结果,然后 PHP 会进一步处理:

这是损坏的结果,使 PHP 窒息:

如果我查看他们的权限,这就是我所看到的(01_Orig 没问题,02_Modif 已损坏):

如果我查看带有unzip -l 的两个包(第一个没问题,第二个已损坏):

这是我的 PHP 函数(两种情况都一样):

$uploads = "uploads_dir/";
$dir = new DirectoryIterator("uploads_dir/");

foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        $filename = $fileinfo->getFilename();
        $zip = new ZipArchive;
        $res = $zip->open($uploads . $fileinfo);
        if ($res === TRUE) {
            $zip->extractTo($uploads . $filename . "_extracted");
            $zip->close();
        } else {
            echo "Unable to unzip";
        }
    }
}

当我在我的 Windows 机器上手动解压缩或使用 7zip 打开它们时,两个上传看起来都很好。

如果我创建两个 zip 文件的两个十六进制转储并比较它们,这就是我得到的:https://gist.github.com/msoutopico/22a9ef647381c2e4d26313f135c526e2

非常感谢任何提示。

更新:

如果相关,则在 linux 服务器中创建(保存)zip 文件,并且完成此操作的两台机器(一台正常工作的一台和损坏包的一台)运行 Windows 10。

【问题讨论】:

  • 所以使用了同一个Java库。但显然文件不一样。我注意到一个使用反斜杠,另一个使用正斜杠。 Linux/OS-X 和 Windows?其余的差异可能是由于使用的字符集。从 Windows ZIP 文件中提取内容时遇到问题是否正确?
  • 好点@KIKOSoftware。 Zip 规范说反斜杠不是有效的路径分隔符。官方只支持“/”。首先检查两台机器上创建的 zip 文件是否有效。如果您有“解压缩”,请对 zip 文件运行“解压缩 -t”。如果这没有显示出问题,请在一个好例子和一个坏例子上运行 zipdetails(如果你没有它,可以在这里找到github.com/pmqs/IO-Compress/blob/master/bin/zipdetails)并发布结果
  • 感谢您的快速回复。我的理解是 PHP 可以理解这两种斜线约定。我已经用这两个包运行了unzip -t <file>,在这两种情况下我都得到“在 的压缩数据中未检测到错误”。
  • @msoutopico 我猜有两个不同版本的java.util.zip.ZipOutputStream 正在使用。
  • 这两个盒子之间肯定有一些不同。我不知道java.util.zip.ZipOutputStream,所以不能评论什么会影响路径分隔符的选择。它可能是一个环境变量,或者与操作系统的配置方式有关。

标签: java php zip ziparchive zipoutputstream


【解决方案1】:

已排序。插件的第 2 版进行了调整,以将文件名中的路径分隔符从 \ 转换为 /。现在,即使在两台机器上都安装了插件的第 3 版,在故障机器上也有一个较旧的(第 1 版,在该调整之前),它是正在使用的,而不是第 3 版。只是删除版本 1 副本已解决问题。 @pmqs 是对的。谢谢大家帮我快速解决这个问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2017-05-25
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多