我正在通过php创建一个大约2-3mbs的zip文件,最后我想将该zip文件发送给用户下载。
不幸的是,由于某些原因,使用以下内容不起作用。好吧它有效,但不是应该的。 该文件应该到达浏览器。我下载它,打开它,但当我尝试exract或查看其中的文件时,分解说它已损坏。但是,如果我去打开目录zip文件中存在的文件打开正常,我可以exract - 查看那里的一切。 任何想法为什么会发生这种情况?
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($zip_name)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($zip_name)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize($zip_name));
header("Content-Disposition: attachment; filename=\"".$zip_name."\"");
readfile($zip_name);
}
}
答案 0 :(得分:2)
尝试在脚本末尾添加 exit(); 。命令 readfile()后,脚本可能会无意中发送空格,例如?> 之后的空白
也适合使用 ob_start() ob_clean()函数。
ob_start();
// .... some code
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize($zip_name));
header("Content-Disposition: attachment; filename=\"".$zip_name."\"");
// disable cache
header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header("Cache-control: private");
header('Pragma: private');
ob_end_clean();
readfile($zip_name);
exit();