PHP 中 ZipArchive 的损坏提取

Corrupt extraction with ZipArchive in PHP

我有一个 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

非常感谢您提供任何提示。

更新:

在相关的情况下,zip 文件在 linux 服务器中创建(保存),并且在两台机器上完成此操作(工作的机器和损坏包的机器)运行 Windows 10.

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