如果文件在上传后重命名,ZipArchive 会抛出错误

ZipArchive throws error if file is renamed after uploading

如果我上传一个 zip 文件并重命名它,ZipArchive 函数会在我尝试解压它时抛出一个 ER_NOZIP 错误,而如果我上传但不重命名它,它将毫无问题地解压。

这是一个已知问题还是我做错了什么?任何帮助都会很棒!

编辑以获取更多详细信息: 过程是这样的:我可以在我的主机上压缩一个文件夹,然后在我的浏览器中通过 PHP 使用 ZipArchive 下载它。然后我有一个过程,我可以上传该 zip 文件并使用 ZipArchive 在我的主机上解压缩它。这很好用。当我下载同名的东西并且 Windows 给它起一个像 "My_file (2).zip".

这样的名字时,问题似乎就来了

当我上传此文件时,出现 NOZIP 错误。我使用 rename() 函数更改它的名称以删除空格等,使其变为 "my_file_2.zip" 但它仍然会引发错误。似乎只有最初命名的文件才有效。

经过大量来回测试我弄明白了,虽然现在看起来很明显。

似乎当我从 script/browser 下载新创建的 zip 时,header mime 类型随机影响了文件(不确定为什么未更改的 zip 存档有效,但重命名的文件没有还是)。

无论如何,在下载脚本中使用这些 headers 似乎已经完全解决了问题:

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $zipDir);

    header("Cache-Control: private, max-age=120, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // long ago
    header("Content-Type: $mimeType");
    header("Content-Transfer-Encoding: Binary");
    header("Content-disposition: attachment; filename=\"" . basename($zipDir) . "\"");
    header("Accept-Ranges: bytes");
    header("Content-Length: " . filesize($zipDir));

以前脚本使用 application/octet-stream 作为 mime 类型,将其更改为使用正确的 zip mime 似乎可以解决问题,因此即使重命名文件等也不会再导致错误。

希望这也能帮助其他可能 运行 遇到类似问题的人。