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

时间:2015-03-24 00:00:21

标签: php ziparchive

如果我上传一个zip文件并重命名,ZipArchive函数会在我尝试提取时抛出ER_NOZIP错误,而如果我上传并且不重命名,则会提取没有问题。

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

有关详情的编辑: 过程是这样的:我可以在我的主机上压缩文件夹并使用ZipArchive在我的浏览器中通过PHP下载它。然后我有一个进程,我可以上传该zip文件并使用ZipArchive将其解压缩到我的主机上。这很好用。当我下载具有相同名称的内容时,问题似乎就出现了,Windows为其命名为" My_file(2).zip"。

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

1 个答案:

答案 0 :(得分:0)

经过大量的来回测试后我发现了它,虽然现在看起来很明显。

当我从脚本/浏览器下载新创建的zip时,标题mime类型随机影响了该文件(不确定为什么未更改的zip存档工作,但重命名的文件仍然没有)。 / p>

无论哪种方式,在下载脚本中使用这些标题似乎已完全解决了这个问题:

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

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