アプリ版:「スタンプのみでお礼する」機能のリリースについて

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();

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

A 回答 (1件)

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();
    • good
    • 1
この回答へのお礼

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

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

お礼日時:2011/04/23 06:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!