訪問者がファイルをダウンロードできるようにする次のスクリプトがあります。
header( 'Content-Type: application/octet-stream' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Disposition: attachment; filename=' . $fileName );
header( 'Content-Length: ' . filesize( $filePath ) );
header( 'Content-Description: Download' );
header( 'Cache-Control: private' );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );
readfile( $filePath );
exit();
うまくいきません。(ファイル名も引用符で囲みましたが、同じ結果です)。
動作が非常に遅く、ダウンロードが停止することさえあります。特に Opera では、ダウンロードの 99% で停止します。すぐに 99% 完了したと表示され、ダウンロードが開始され、約 34% で停止することもあります。
サーバーは共有ホスト、Mac OS X サーバーです。
Firefox のライブ HTTP ヘッダー アドオンを使用すると、サーバーが追加のヘッダーを応答に追加することに気付きました。
HTTP/1.1 200 OK
Date: Thu, 18 Feb 2010 09:27:25 GMT
Server: Apache
X-Powered-By: PHP/5.2.12
Content-Transfer-Encoding: binary
Content-Disposition: attachment; filename=test.psd
Content-Length: 398635
Content-Description: Download
Cache-Control: private
Pragma: no-cache
Expires: 0
Content-Encoding: gzip // <-- expecially this one,
Vary: Accept-Encoding // <-- this one,
MS-Author-Via: DAV // <-- and this one
Keep-Alive: timeout=10, max=100
Connection: Keep-Alive
Content-Type: application/octet-stream
これらが問題の原因である可能性はありますか?
ローカルホストでスクリプトを実行すると、すべて正常に動作します。また、このホストからファイルを直接ダウンロードすると、速度もスムーズでスムーズです。
私はこれについて本当に無知です。あなたの助けに感謝します。前もって感謝します。
アップデート:
問題をボトルネックに絞り込んだと思います。Web サーバーは自動的に出力を gzip 圧縮します。Content-Length
PHP スクリプトからヘッダーを削除すると、すべてがスムーズにダウンロードされ始めました。これは理にかなっています: の値はContent-Length
、実際の gzip された出力ともはや一致しません。PHP では、圧縮されていないファイルサイズを読み取ってContent-Length
ヘッダーを設定しましたが、その後、Apache がそれを圧縮しました。これはおそらく、ブラウザーが詰まった場所です。
Content-Length
この質問に続いて、Web サーバーが出力を自動的に gzip 圧縮するときに正しいヘッダー サイズを設定する方法について質問します。