Php 未正确设置内容长度标题
我有一个php脚本(实际上),它通过在响应中添加正确的标题,强制单击链接的用户下载该链接 此链接在90%的时间内运行良好。偶尔会传递不正确的内容长度,因此用户会收到明显被截断的文件。错误总是发生在特定的文件上,但是如果这些文件被重新上传,错误可能不会出现在新实例上,这使我认为这不是文件的问题,而是某个缓存的问题。所以我每次运行clearstatcache()都没有用。奇怪的是,php正在传递正确的文件大小,或者当我将它插入的字符串传递到日志文件时,它说是这样 以下是相关代码:Php 未正确设置内容长度标题,php,drupal,http-headers,content-length,http-content-length,Php,Drupal,Http Headers,Content Length,Http Content Length,我有一个php脚本(实际上),它通过在响应中添加正确的标题,强制单击链接的用户下载该链接 此链接在90%的时间内运行良好。偶尔会传递不正确的内容长度,因此用户会收到明显被截断的文件。错误总是发生在特定的文件上,但是如果这些文件被重新上传,错误可能不会出现在新实例上,这使我认为这不是文件的问题,而是某个缓存的问题。所以我每次运行clearstatcache()都没有用。奇怪的是,php正在传递正确的文件大小,或者当我将它插入的字符串传递到日志文件时,它说是这样 以下是相关代码: clearst
clearstatcache();
return array(
'Content-Type: ' . $mimeinfo,
'Content-Disposition: ' . $disposition . '; filename="' . basename($filepath) . '";',
// Content-Length is also a good header to send, as it allows the browser to
// display a progress bar correctly.
// There's a trick for determining the file size for files over 2 GB. Nobody
// should be using this module with files that large, but… the sprintf()
// trickery makes sure the value is correct for files larger than 2GB. See
// note at http://php.net/filesize
'Content-Length: ' . sprintf('%u', filesize($filepath)),
);
sprintf(“%u”,filesize($filepath))在一个不工作的文件上的输出示例是2682059
,当浏览器看到它时,它会以某种方式转换为1740048
我试图删除sprintf函数,但没有成功。
我也尝试过根本不包含内容长度声明,但有人却附加了不正确的值。最后一条证据可能表明,其他一些代码正在覆盖我在这里设置的内容头,但它似乎忽略了我在上述代码中更改的任何其他头,以测试该理论
想知道去哪里找吗?我解决了这个问题
事实证明,Drupal中的另一个模块添加了自己的内容长度头,并从数据库而不是直接从文件中获取值(奇怪),这是在下游进行的。通过颠倒模块获得标题的顺序,问题就消失了。我已针对违规模块提交了错误报告。来源:
PHP中有一个名为header的函数,您希望在实际页面加载之前使用该函数设置标题:
以下是该函数的框架:
void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
说明: 参数:
- 串
- 替换
- http\u响应\u代码
例子:
注意:在发送任何输出之前,即在任何HTML标记之前或在任何回显调用之前,必须调用该函数
就你而言:
<?php
header('Content-Length: ' . sprintf('%u', filesize($filepath)));
?>
默认情况下为-true的replace参数将导致程序覆盖所有以前设置的“Content-Length”头
希望所有的解释都是值得的……:) 你试过用filesize($filepath)检查你得到的文件大小吗?是的,第一个数字(2682059)也是
filesize($filepath)
返回的。真的很奇怪!但我很高兴你能解决这个问题@NicholasEvans我添加了一个完全不同方法的替代解决方案
<?php
header('Content-Length: ' . sprintf('%u', filesize($filepath)));
?>