【问题标题】:ZipArchive throws error if file is renamed after uploading如果文件在上传后重命名,ZipArchive 会抛出错误
【发布时间】:2015-03-24 22:44:41
【问题描述】:

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

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

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

当我上传这个文件时,我得到了 NOZIP 错误。我使用 rename() 函数来更改它的名称以删除空格等,使其变为“my_file_2.zip”,但它仍然会引发错误。似乎只有最初命名的文件可以工作。

【问题讨论】:

    标签: php ziparchive


    【解决方案1】:

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

    似乎当我从脚本/浏览器下载新创建的 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 似乎可以解决问题,因此即使重命名文件等也不会再导致错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-26
      • 2016-01-28
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多