我有一个 php 脚本(实际上是https://drupal.org/project/file_force),它通过在响应中添加正确的标题来强制单击链接的用户下载该链接。
此链接 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 功能无济于事。我也尝试过完全不包含 Content-Length 声明,但无论如何都会有人附上不正确的值。最后一条证据可能表明其他一些代码正在覆盖我在此处设置的内容标头,但它似乎没有留下我在上述代码中更改的任何其他标头以测试该理论。
有什么想法在哪里看吗?