如果文件在上传后重命名,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 似乎可以解决问题,因此即使重命名文件等也不会再导致错误。
希望这也能帮助其他可能 运行 遇到类似问题的人。
如果我上传一个 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 似乎可以解决问题,因此即使重命名文件等也不会再导致错误。
希望这也能帮助其他可能 运行 遇到类似问题的人。