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

我有一个php脚本(实际上),它通过在响应中添加正确的标题,强制单击链接的用户下载该链接

此链接在90%的时间内运行良好。偶尔会传递不正确的内容长度,因此用户会收到明显被截断的文件。错误总是发生在特定的文件上,但是如果这些文件被重新上传,错误可能不会出现在新实例上,这使我认为这不是文件的问题,而是某个缓存的问题。所以我每次运行clearstatcache()都没有用。奇怪的是,php正在传递正确的文件大小,或者当我将它插入的字符串传递到日志文件时,它说是这样

以下是相关代码:

  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/(大小写不重要)开头,该字符串将 用于计算要发送的HTTP状态代码。例如,如果 您已经将Apache配置为使用PHP脚本来处理 缺少文件(使用ErrorDocument指令),您可能需要 确保脚本生成正确的状态代码

  • 替换
可选的replace参数指示头是否 应替换以前的类似标题,或添加 同样的类型。默认情况下,它将被替换,但如果您将FALSE作为 第二个参数可以强制使用同一类型的多个标头

  • http\u响应\u代码
强制HTTP响应代码为指定的值。请注意 参数仅在字符串不为空时有效

===

返回值:

不返回任何值


例子:

注意:在发送任何输出之前,即在任何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)));
?>