Php 如果上载后重命名文件,ZipArchive将引发错误
如果我上传一个zip文件并对其重命名,当我试图提取它时,ZipArchive函数会抛出一个ER_NOZIP错误,而如果我上传但不重命名它,则提取时不会出现任何问题 这是一个已知的问题还是我做错了什么?任何帮助都会很好 有关详细信息,请编辑: 这个过程是这样的:我可以在我的主机上压缩一个文件夹,然后使用ZipArchive在我的浏览器中通过PHP下载它。然后我有一个过程,我可以上传这个zip文件,并使用ZipArchive在我的主机上解压它。这个很好用。当我下载同名的东西,Windows给它起了一个类似“My_file(2).zip”的名字时,问题似乎就来了Php 如果上载后重命名文件,ZipArchive将引发错误,php,ziparchive,Php,Ziparchive,如果我上传一个zip文件并对其重命名,当我试图提取它时,ZipArchive函数会抛出一个ER_NOZIP错误,而如果我上传但不重命名它,则提取时不会出现任何问题 这是一个已知的问题还是我做错了什么?任何帮助都会很好 有关详细信息,请编辑: 这个过程是这样的:我可以在我的主机上压缩一个文件夹,然后使用ZipArchive在我的浏览器中通过PHP下载它。然后我有一个过程,我可以上传这个zip文件,并使用ZipArchive在我的主机上解压它。这个很好用。当我下载同名的东西,Windows给它起了一
当我上传这个文件时,我得到了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似乎可以解决问题,因此即使重命名文件等也不会再导致错误
希望这也能帮助其他可能遇到类似问题的人