我使用此代码使用户能够下载zip文件:
if(file_exists($filename)){
header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename)));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($filename));
flush();
$fp = fopen($filename, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush();
}
fclose($fp);
exit;
}
下载文件时,它只下载25,632千字节的数据。但是zip文件是26,252千字节......
为什么浏览器会获得所有25MB然后停止?
我检查了Content-Length
标题以确保它是正确的,它是......
在firefox中,当我下载文件时,它会显示“25mb”,因此浏览器认为25mb是COMPLETE数量...但是,echo的内容长度是26252904?
答案 0 :(得分:3)
在代码
之前添加此内容ob_clean();
ob_end_flush();
答案 1 :(得分:2)
您的header('Content-Type ...)
电话无效,因为只有最后一个电话会被发送到浏览器。
下载由Content-Disposition: attachment
触发。如果您要发送zip文件,则应发送实际的Content-Type: application/zip
。
最后,你的阅读循环是不必要的。
总而言之,您的代码应如下所示:
if (file_exists($filename)) {
$quoted_filename = basename(addcslashes($filename, "\0..\37\"\177"));
header("Content-Disposition: attachment; filename=\"{$quoted_filename}\"");
header('Content-Type: application/zip');
header('Content-Length: '.filesize($filename));
readfile($filename);
}
答案 2 :(得分:0)
使用单个MIME类型来表示数据。
在这种情况下使用application/octet-stream
会很好。这是你事先不知道MIME的时候。当你知道它时,你必须把它。不要使用多个内容类型标头。
通常,当浏览器不知道如何处理特定MIME时,它将触发下载过程。此外,使用Content-disposition: Attachment; ..
可以确保它。
存在一个简单的readfile($filename)
,它会将文件的字节发送到请求流程,如下所示:
header("Content-disposition: attachment;filename=" . basename($filename);
readfile($filename);
答案 3 :(得分:0)
我有类似的问题。该文件在Firefox中下载得很好,但在IE中没有。似乎Apache正在压缩文件,IE无法解压缩,因此文件已损坏。解决方案是禁用Apache中的gzipping。您还可以检查PHP是否在运行时不进行gzipping并禁用它。 对于Apache,您可以尝试:
SetEnv no-gzip 1
对于PHP,在.htaccess:
php_flag zlib.output_compression on
答案 4 :(得分:0)
这个答案绝对不是真正的答案。
然而我确实让它工作......我只是将Content-Length设置为30000000.因此它认为文件比实际大,然后它全部下载。
丑陋的黑客,我知道,但我找不到任何其他方式