PHP发送的ZIP存档已损坏

时间:2012-11-23 11:22:42

标签: php zip

我正在使用php ZipArchive即时创建一个zip文件并将其发送回用户。我暂时将压缩文件存储在文档根目录上的文件夹中,然后使用代码

将其发回
header('Content-type:application/zip');
header('Content-Disposition: inline; filename="'.("file.zip").'"');
header("Content-Transfer-Encoding: binary");
header("Content-Length:".filesize($file));
$fh = fopen($file,'rb');
fpassthru($fh);

首次发布后

$zip->close()

确保文件未打开。我遇到的问题是 - 存储的zip文件是一个有效的存档,我可以在Windows 7,7Zip,WinZIP等中打开。但是,当我用上面的代码向下发送文件时,它最终会有一个0xD 0xA对在文件的开头,这足以使其损坏。我无法弄清楚这些角色可能来自哪里。这是fopen / fpassthru的已知错误吗?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:12)

我在删除header("Content-Length:".filesize($file));行时发现它修复了我同样的问题......

答案 1 :(得分:4)

经过多次尝试下载zip文件后,解决方案是:

$result = create_zip($files_to_zip,$fileZip,true,$path_parts['dirname']);
ob_clean();
ob_end_flush(); // more important function - (without - error corrupted 
zip)
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header('Content-Type: application/zip;\n');
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition: attachment; filename=\"".basename($fileZip)."\"");
readfile($fileZip);
unlink($fileZip);
exit();

答案 2 :(得分:3)

您的完整脚本是什么样的?

一般来说,您应该删除脚本文件末尾的任何结束PHP标记,因为它可能是从脚本末尾或包含的脚本输出的。

答案 3 :(得分:0)

谢谢@_on! 您帮助了我这些信息。 但是,我没有删除header ("Content-Length:". Filesize ($ file)) ;,而是插入了一个换行符“ \\ n”,并保留了以下内容:

header ("Content-Length:". filesize ($ file). "\\n");

文件会生成其大小以帮助下载 好吧。 Tks