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();
---------------------------------------------
ご教授お願いします。
No.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();
早急なご回答有難うございます。
ご教授して頂いた方法に変更して実行してみました。
読み込みとレスポンス送信は1秒たらずでできるようになりました。
ただ、いまだにすぐにダイアログが表示されません。
os.close();の後は何も処理はしておらず、returnで戻してるだけなのですが・・・。
今回の環境と実行は、大量データがDBにある時かつ大量データの
抽出する目的でおこなっています。
データが少ない時は全く問題がありませんでした。
大量データのテストの時は、DBから抽出するのに3分→CSV作成に8分→
圧縮は1秒の過程です。でも、圧縮後のzpファイルは15kb程なので
ファイルが重過ぎることではないと思います。
なにか他に原因があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
Eclipseで検索ができなくなった
-
ディレクトリのサイズの取得
-
VBAで、JPG写真の撮影日時を読...
-
includeで別サイトを読み込む
-
0バイトのテキストファイル
-
vbaの構文の修正相談(xmlファ...
-
ファイル作成日時と更新日時を...
-
リソースファイルを認識してく...
-
【VBA】複数CSVの特定範囲を1つ...
-
msgget()で指定するkey値について
-
PHPからベーシック認証のかかっ...
-
HTMLテキストリンクでExcelファ...
-
VBSで、日本語文字列の抽出が、...
-
GetOpenFileName()について
-
BASP21のファイルアップロード...
-
main関数のコマンドライン引数...
-
[C#]FTPでの複数のファイル...
-
C++によるファイル送受信プログ...
-
XMLShemaからXML文書を作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
0バイトのテキストファイル
-
Eclipseで検索ができなくなった
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
サイトマップにサブドメインを...
-
【VBA】複数CSVの特定範囲を1つ...
-
C++によるファイル送受信プログ...
-
C++.NET 2003 「空のドキュメ...
-
HTMLまたはJavaScriptでフ...
-
main関数のコマンドライン引数...
-
BASP21のファイルアップロード...
-
2GB以上のファイルを扱う方法
-
ファイル作成日時と更新日時を...
-
openglで音楽を再生する
-
MusicXMLファイル作り方教えて...
-
vbaの構文の修正相談(xmlファ...
-
VB6.0のメモリリークについて
-
Javaのファイルダウンロードに...
-
ディレクトリのサイズの取得
おすすめ情報