如果文件在上传后被重命名,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",但它仍然抛出一个错误。似乎只有最初命名的文件才能工作。

我在反复测试后发现了这一点,尽管现在看起来很明显。

当我从脚本/浏览器下载新创建的zip时,头mime类型似乎随机影响了文件(不确定为什么未更改的zip档案有效,但重命名的文件仍然无效)。

不管怎样,在下载脚本中使用这些标题似乎已经完全解决了这个问题:

    $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似乎可以解决这个问题,因此即使重命名文件等也不会再导致错误。

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