アプリケーションでのファイルのダウンロードに関して非常に奇妙な問題があります。私は長く広範囲に検索しましたが、適切な解決策を見つけることができませんでした。誰かが助けてくれることを期待して、問題をできるだけ明確に説明しようとします。
フォームを送信した後、1 つの xls ファイルと 1 つの csv ファイルを含む zip ファイルで構成される動的に生成されたレポートをユーザーがダウンロードする JSF アプリケーションがあります。zip ファイルのサイズとレポートを生成する時間は、ユーザーが選択した期間によって異なります。
サーバーでは、応答を次のように扱います。
response.reset();
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=\"file.zip\"");
次に、サーバーの一時ディレクトリ (セッションごとに一意) に csv ファイルと xls ファイルを生成し、応答出力ストリームに直接圧縮します。
検索条件に短い期間を選択する場合は、すべて問題ありません。しかし、時間間隔を長くすると、IE と Firefox は応答を「失う」ように見えます。サーバーが応答へのファイルの書き込みを終了しても、IE では要求は「保留中」のままですが、FF ではタブに「接続中」スピナーが表示されます。いずれの場合も、サーバー ログに例外はありません。ダウンロード ダイアログは表示されません。
私が困惑しているのは、検索条件に関係なく、Chromium が毎回問題なくファイルを開くことです。また、ブレークポイントを設定して数分待つなどして、ローカル環境で問題を再現できなかったため、問題はテスト展開に起因しているようです。
待ち時間とファイル サイズは驚くべきものではありません。レポートを完了するのに 1 MB 未満、2 分未満です。
FF を使用した成功したレポートの関連する要求ヘッダーと応答ヘッダーは次のとおりです (削除されたホスト、実際のファイル名など)。
Request:
User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0
Connection:keep-alive
Accept-Language:en-US,en;q=0.5
Accept-Encoding:gzip, deflate
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Response:
Transfer-Encoding:chunked
Server:Apache/2.2.3 (CentOS)
Keep-Alive:timeout=10, max=98
Expires:Mon, 08 Apr 2013 11:43:49 GMT
Date:Mon, 08 Apr 2013 11:43:48 GMT
Content-Type:application/zip;charset=ISO-8859-1
Content-Disposition:attachment;filename="file.zip"
Connection:Keep-Alive
Cache-Control:max-age=1
応答が実際にブラウザーに届いていると想定しても安全ですが、どういうわけかめちゃくちゃになり、IE も FF もダウンロード ダイアログを表示しません。
どんな助けでも大歓迎です。
編集:利用可能なすべてのツールでリクエスト/レスポンスサイクルをデバッグしようとしたことを忘れていました:IE、FF、Firebug、Fiddlerの組み込み開発ツール...残念ながら、影響を受けるブラウザではレスポンスが機能しないため、あまり役に立ちません真っ先に現れる。
編集 2:暗闇でのさまざまなショット:
- Chrome インスペクタは、レポートを要求した後にコンソールに次のメッセージを表示します: リソースはドキュメントとして解釈されましたが、MIME タイプ application/zip: " https://xxxxxxx.xxx/xxxxx.faces " で転送されました。
- ファイルは正しく保存されますが、Chrome インスペクタは [ネットワーク] タブでリクエストを「キャンセル済み」と表示します。
- 残りのページでは、応答エンコーディングは UTF-8 ですが、zip ファイルは ISO-8859-1 です。どこにも指定されていないことがわかっている限り、これはデフォルト値のようです。「application/zip;charset=UTF-8」を表示するようにしましたが、これが影響するかどうかを確認するには、テスト サーバーにデプロイする必要があります。
編集 3:更新: テスト展開で Apache をバイパスし、(ローカル環境のように) Tomcat にすべてを処理させると、問題が解消され、Apache が主な原因になります。唯一の明らかな違いは、Apache によってそこに配置されるキープアライブ応答ヘッダーです。問題の原因となっている構成を見つけようとして、ローカル環境でTomcatをいじっていますが、今のところうまくいきません。助言がありますか?