我正在使用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的已知错误吗?任何帮助将不胜感激。
答案 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