こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルのダウンロードが遅い

windows環境のクライアントPCにブラウザからファイルをダウンロードさせる
javaプログラムを作成しています。
linuxのサーバー側でcsvを圧縮したzipファイルを作成しているのですが
zipの作成処理までは速いのに、その後のファイル保存のダイアログに
とても時間がかかります。なぜなのか分からず困っています。


以下、保存ダイアログ表示のコードです。
---------------------------------------------
FileInputStream fi = new FileInputStream(ファイルパス/temp.zip);
byte[] b = new byte[fi.available()];
for (int i = 0; i < b.length; i++)
b[i] = (byte)fi.read();

response.setContentType("application/octet-stream; charset=Windows-31J");
response.setHeader("Content-Disposition","attachment; filename=\"temp.zip\"");
response.setContentLength(b.length);

ServletOutputStream os = response.getOutputStream();
os.write(b);
os.close();

fi.close();

---------------------------------------------
ご教授お願いします。

投稿日時 - 2011-04-21 00:43:10

QNo.6682798

すぐに回答ほしいです

質問者が選んだベストアンサー

1バイトずつ読み込んでいる&全部読み込んでから送ってるので遅いのでしょう。
ブロック単位で読む&逐次送信するといいですよ。

File zipFile = new File("ファイルパス", "temp.zip");
response.setContentType("application/octet-stream; charset=Windows-31J");
response.setHeader("Content-Disposition","attachment; filename=\"temp.zip\"");
response.setContentLength(zipFile.length);
int len;
byte[] buf = new byte[1024];
InputStream is = new FileInputStream(zipFile);
ServletOutputStream os = response.getOutputStream();
while((len = is.read(buf)) >= 0){ // bufのサイズまで読み込む、実際に読んだ長さはlenに入る
os.write(buf, 0, len); // 読み込んだサイズ分送信する
}
is.close();
os.close();

投稿日時 - 2011-04-21 09:26:49

お礼

早急なご回答有難うございます。
ご教授して頂いた方法に変更して実行してみました。
読み込みとレスポンス送信は1秒たらずでできるようになりました。
ただ、いまだにすぐにダイアログが表示されません。
os.close();の後は何も処理はしておらず、returnで戻してるだけなのですが・・・。

今回の環境と実行は、大量データがDBにある時かつ大量データの
抽出する目的でおこなっています。
データが少ない時は全く問題がありませんでした。
大量データのテストの時は、DBから抽出するのに3分→CSV作成に8分→
圧縮は1秒の過程です。でも、圧縮後のzpファイルは15kb程なので
ファイルが重過ぎることではないと思います。
なにか他に原因があるのでしょうか?

投稿日時 - 2011-04-23 06:46:40

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問