2009-04-24 6 views
1

HTTP Content-Typeを「application/zip」、Content-Dispositionを「attachment」、レスポンスのOutputStreamに設定してファイルを送信するサーブレットがあります。ローカルのアプリケーションサーバーにデプロイすると正しく動作し、ブラウザーにポップアップが表示され、ファイルをダウンロードするかどうかを選択できます。クラスタ化されたサーバー上でIEと異なる動作をするファイルをダウンロードする

ただし、クラスタ化されたjbossサーバーにデプロイすると、IEは転送全体のファイル情報を要求して0%でハングし、ファイルがダウンロードできなかったというエラーメッセージが表示されて失敗します。 FFとChromeでは、サーブレットは正しく動作します。つまり、localhostと同じです。

手がかりはありますか?

私はまた、サーブレットコードの重要な部分の小さなスニペットを提供することができます。

response.setContentType("application/zip; name=" + f.getName()); 
response.setContentLength((int)f.length());  
response.addHeader("Content-Disposition", "attachment;filename=" + f.getName()); 
byte[] buf = new byte[1024]; 
int bytesRead; 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
OutputStream os = response.getOutputStream(); 
while((bytesRead = bis.read(buf)) != -1) { 
    os.write(buf, 0, bytesRead);     
} 
os.flush(); 
bis.close(); 

私は本当に問題は私のサーブレットコードまたはクラスタ化されたサーバ構成である場合は知っているが、私はありません2番目のチャンスを推測するのは正しいかもしれません...私のクラスタ構成で何が間違っているかも考えていますか?

+0

クラスタ化されたJBossサーバーでアプリケーションをテストするときにSSL接続を使用していますか?はいの場合、それは説明かもしれません - 私は以前に同様の問題を抱えていました。 – simon

+0

いいえ、両方のサーバー上のプレーンなHTTP – Raibaz

+1

あなたの問題に関係ない観察:Content-Typeには「名前」パラメータはありません。また、ファイル名にカンマ、空白、ASCII以外の文字が含まれていると、Content-Dispositionのfilenameパラメータが失敗します。 –

答えて

1

[OK]を修正しました。

クライアントと個々のクラスタサーバーの間にあるロードバランサは、すべてのHTTP応答に「Cache-Control:no-cache」を追加しました。その結果、IEが狂ってしまいました。

ヘッダーディレクティブを削除すると、問題が解決しました。

1

これはおそらくこれらの記事で説明したIEの行動の結果である:

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B181050

http://support.microsoft.com/default.aspx/kb/813827

私は、ファイルサイズであった場合にのみ発生し、(Tomcatのみと)同様の問題がありました十分大きい。ダウンロードが開始されてからエラーメッセージが表示されるまでの時間を測定することで簡単にテストできます。その時間が一定であれば、おそらく同じエラーが発生します。ファイルが十分に速く読み込まれるため、エラーがローカルで表示されることはありません。

ファイルが生成されてからタイムアウトが発生する場合は、ファイルを非同期で作成し、ファイルのダウンロード準備が整った後でダウンロードを開始することをお勧めします。

+0

ファイルは既に非同期で作成されているため、生成に問題はありません。ブラウザのタイムアウトに関連しているとは思わないが、ローカルマシンとリモートマシンの両方で正常に動作するため、クラスタ – Raibaz

関連する問題