私は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 宣言をまったく含めないようにしましたが、とにかく誰かが間違った値に関連付けられています。この最後の証拠は、他のコードがここで設定しているコンテンツ ヘッダーをオーバーライドしていることを示唆している可能性がありますが、その理論をテストするために上記のコードで変更した他のヘッダーはそのままにしてあるようです。
どこを見ればよいか、何か考えはありますか?