[英]PHP Content-Length header not working
我正在尝试使用此代码下载 .zip 文件
<?php
$file = "something.zip";
$size = filesize($file);
header('Content-type: application/octet-stream');
header("Content-length: $size");
header('Content-Disposition: attachment; filename="downloaded.zip"');
readfile($file);
?>
但它似乎不起作用,即使我尝试将文件大小设置为header("Content-length: 567247784");
. 我只得到一个没有声明大小的文件,或者一个像 28 字节这样的小文件。
我看了这个问题,我想我和海报有同样的问题,但他的解决方案是“存在服务器问题”。 我想我也有服务器配置问题,但他的回答根本没有帮助我。
它与 mod_deflate 挡路有关。 我花了一天时间弄乱 .htaccess 并尝试了一百万种不同的东西,最后这修复了它,但我无法真正解释原因:
header('Content-Length: '.$filesize);
header("Content-Range: 0-".($filesize-1)."/".$filesize);
我想补充一点,我的 PHP 配置的内存少于 256MB。
我认为最简单和最好的方法是:
$head = array_change_key_case(get_headers($file, TRUE));
$filesize = $head['content-length'];
在这种情况下,尝试删除尾随的?>
。 ?>
之后的换行符或空格可以改变结果。
通常,网络服务器会自动设置 Content-Length 标头。
对于调试,您可以使用非常棒的http://fiddler2.com/来检查标头,甚至可以编写任意请求来测试您的假设。 如果内容正文与Content-Length
标头不同,Fiddler 将发出警告。
继 TeeraMusic 出色的分析https://stackoverflow.com/a/30569921/820841 之后,该分析将 mod_deflate 确定为罪魁祸首👍
apache_setenv('no-gzip', '1');
为此请求停止 mod_deflate 的正确方法。
控制哪些文件是 DEFLATE 的选项很可能在您的.htaccess
或httpd.conf
:
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
...
Content-Type
并且它不仅仅是作为text/html
匹配。Content-Type
。也许是这个问题: header("Content-length:" . $size);
但我可能是错的
我遇到了同样的问题,在我的情况下,当我在某个 php 文件中发现<?php
标签之前包含一个转义字符时,它就解决了。 然后,返回的页面大于$size = filesize($file);
这会导致错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.