【发布时间】:2020-03-09 13:40:06
【问题描述】:
我有一个 PHP 脚本必须解压缩一些上传文件。上传是打包的文件夹,基本上是带有自定义扩展名的 zip 文件。
我在一台机器上打包了一些 zip 文件时遇到了问题,但在另一台机器上打包的同一个文件夹却没有问题。在这两种情况下,压缩都是使用同一个 Java 库完成的。
如果我查看他们的权限,这就是我所看到的(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