• ベストアンサー
  • すぐに回答を!

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

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(); --------------------------------------------- ご教授お願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数2535
  • ありがとう数1

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

  • ベストアンサー
  • 回答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

  • Strutsによるバイナリファイル出力

    FileInputStream stream =new FileInputStream("C:/Test.exe"); String filename = "Test1.exe"; int bytesRead = 0; byte[] buffer = new byte[256]; HttpResponse.setContentType("application/octet-stream; charset=UTF-8"); HttpResponse.setHeader("Content-Disposition","attachment; filename=\""+filename+"\""); ServletOutputStream sos =HttpResponse.getOutputStream(); while ((bytesRead = stream.read(buffer,0,256) != -1) {  sos.write(buffer); } sos.flush(); sos.close(); stream.close(); 以上のコードでローカル内にあるファイルを名前を変え転送していますが クライアントにより正常なファイルだったり異常なファイルだったりします。 異常なファイルはクライアントによりばらばらですが、ファイルサイズが正常のものより少し大きかったりします。 バッファーではなくバイト単位での転送も試みたのですが 結果は同じでした。 何かおかしい点ありましたらご指摘いただけますでしょうか。

    • ベストアンサー
    • Java
  • strutsでファイルダウンロード(WinでOK,linuxでNG)

    strutsでWindowsのexeファイルのダウンロードを実装しましたが、Windows上のtomcatにdeployすると正常にダウンロードできるのに、linux(fedora-core3)上のtomcatにdeployすると、ダウンロードしたファイルがhtmlになってしまいます。 hoge.exeという名前のファイルはダウンロードできるのですが、それが実はテキストで、メモ帳で開くと、ダウンロード画面のhtmlが表示されます。 この状況は何によって生み出されているのでしょうか。 お分かりになる方、ヒントをお願いいたします。 以下にファイルダウンロード部のソース(抜粋)を掲載させていただきます。 ----- 以下ソース ----- protected void download(HttpServletResponse response, String fileType, String filename) { try { // exeファイルのダウンロード時 if (fileType.equals("application/octet-stream")) { response.setHeader("Content-Disposition", "attachment; filename=" + filename); } response.setContentType(fileType); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename)); BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); byte[] buf = new byte[128]; int size; while ((size = bis.read(buf, 0, buf.length)) != -1) { bos.write(buf, 0, size); } bos.close(); bis.close(); } catch (IOException e) { throw new thisSystemException("could not send file[" + filename + "]"); }

    • ベストアンサー
    • Java
  • BLOBをダウンロードして別ウインドウで表示したい。

    申し訳ありありませんが、どなたか答えていただけると幸いです。 byte[] data = bl.getBytes(1, (int)bl.length()); int imgSize = (int)bl.length(); String file = URLEncoder.encode(rs_index.getString(ファイル名)); response.setContentType("application/octet-stream-dummy"); response.setHeader("Content-Disposition","inline; filename=\"" + file + "\""); response.setHeader("Pragma", ""); response.setHeader("Cache-Control","max-age=0"); response.setContentLength(data.length); response.getOutputStream().write(data); response.flushBuffer(); こんな感じなのですが、IEでダウンロードして表示をしますと、 IEでEXCELなどが表示されてしまいます。 エクスプローラの設定をいじらずに、EXCELはEXCELで表示するように できないのでしょうか? HTMLのように、target="_blank"みたいにしたいのですが・・・ Java初心者なので、よくわかっていないかもしれませんが、 宜しくお願い致します。

  • ファイル圧縮について。

    ファイル圧縮について質問させてください。 以下のようなメソッドを作成したのですが、 public run(String strFiles[], String strZipFileName) { int i = 0; int iLen = 0; FileInputStream fis = null; FileOutputStream fos = null; ZipOutputStream zos = null; ZipEntry zent = null; byte[] buf = new byte[1024*10*10]; try { fos = new FileOutputStream(strZipFileName); zos = new ZipOutputStream(fos); for (i = 0; i < strFiles.length(); i++) { fis = new FileInputStream(strFiles[i]); zent = new ZipEntry(strFiles[i]); zos.putNextEntry(zent); while (-1 != (iLen = fis.read(buf))) { zos.write(buf, 0, iLen); } zos.flush(); zos.closeEntry(); fis.close(); } } catch(Exception e) { System.err.println(e); } finally { try { zos.close(); // ※1 fos.close(); // ※2 } catch(Exception e) { System.err.println(e); } } } サイズの小さいファイルや、 特定のサイズのファイル(13k程度)を対象とした時、 高い確率で、空の圧縮ファイルが作成される事があります。 ログを出力しながら確認すると、このような現象が起きた場合、 圧縮ファイルをcloseする直前(※1)では作成されたファイルはサイズがあるのですが、 圧縮ファイルをcloseした直後(※2)ではファイルのサイズが0になってしまいます。 また、2台あるサーバの内、1台だけでこの現象が起こっています。 javaのバージョンは1.3です。 何故このような現象が起こってしまうのか、 ご存知の方がいらっしゃいましたら教えていただけないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • テキストファイルが読み込めない

    みなさんはじめまして、下記ソースなんですが「FileInputStream fi = new FileInputStream(inputFile);」の手前までは処理が流れるの ですが、その後の処理が流れなくて困っています。 ターゲットとなる「test.txt」ファイルはHTML・JAVAソースファイル クラスファイルと同じフォルダに存在します。 特に保存先等を指定していないので、必然的に同じフォルダ内を見てフ ァイルを読み込みに行くんですけど、読み込まず、そのまま処理が流れ てしまいます。 どこかやり方がいけないところがあるんでしょうか? public String FileInput(){ byte data[] = new byte[16]; String number = ""; try { File inputFile = new File("test.txt"); FileInputStream fi = new FileInputStream(inputFile); /* データを読み込み */ if(fi.read(data)== 16){       /* 0バイト目から9バイト目までを読み込み */ if(new String(data,0,9).equals("010105502")){         /* 0バイト目から16バイト目までをnumberに代入 */ number = new String(data,0,16); } } fi.close(); } catch(FileNotFoundException e){ e.printStackTrace(); } catch(IOException e){} return(number); }

    • ベストアンサー
    • Java
  • CSVファイルをダウンロード時のファイル名文字化けについて

    weblogic+java1.4.2+struts+IE6.0 でWebシステム開発を行っています。 CSVファイルをダウンロードする機能で、 CSVファイル名が全角で60バイト以上にしたとき、ダウンロード時のファイル名の先頭が 「08」、「C9」などに文字化けしてしまいます。 60バイト以内にするとファイル名は正常に表示されます。 ぜひこの現象に対する対応策、URLなどご存知の方はご教授ください。 また回避不可能な場合、理由または技術情報が明記されたURL、技術文献の情報などありましたら そちらもお教えください。 outputstream出力時のソースは以下の通りです。 ↓ try{ response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));     response.getOutputStream().write(fileContents); }catch (Exception e){ }finally{ response.getOutputStream().close(); } return null; 以上宜しくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレットでのファイルダウンロードについて

    サーブレットでファイルのダウンロードを 行うプログラムを作成しているのですが ときどきダウンロードするファイルが切れている 場合があります。 なので実際のファイルとダウンロード時のファイル の違いがあった場合はJSPでalert表示を行いたい のですが、うまく実行できません。 処理としては response.setHeader(......) response.setContentType(......) 等の設定を行い ダウンロードするファイルのInputStream を作成、OutputStreamにgetOutputStream() を取得してwriteしています。 上記のwriteする時に件数をカウントして このサーブレットの呼び元のjspに返却したい のですが、取得ができません。 何か参考になるサイトなどないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • ie8でのファイルダウンロード

    javaで作成したプログラムからファイルをダウンロードする際に、 稀にファイルと拡張子の間に半角英数字が8文字付加されて 保存先を指定するダイアログに表示される場合があります。 javaでは以下の様にファイル名を指定しています。(抜粋) strWorkFileName = "PO.DAT"; response.setHeader("Content-Disposition", "attachment;filename=" + strWorkFileName); 通常表示されるファイル名:PO.DAT まれに表示されるファイル名:POCAY7P4Y1.DAT CAY7P4Y1の箇所は現象が発生する度に異なります。 どなたか原因がわかるかたいらっしゃいませんか? 発生した環境 OS:Windows 7 ブラウザ:IE8

  • CSVファイルのダウンロードについて

    サーバー上にアップしたcsvファイルにアクセスすると ダウンロードの確認ダイアログが出ずに 画面上にテキストベースで表示されてしまいます。 フォルダオプションの設定で ダウンロード後に開くを確認するのチェックボックスを チェックしましたがうまくいきません。 宜しくお願いします。 ※Webサーバー・・・JRUN4 <-- sample.jsp --> <% response.setContentType("application/octet-stream-dummy; charset=iso-2022-jp"); %> <% response.setHeader("Content-Disposition","inline; filename=aaa.csv"); %> top.location.href=~aaa.csv ← ファイルのフルパス

    • ベストアンサー
    • Java
  • ファイルのダウンロードダイアログが2度表示される

    いつも拝見させて頂いており、お世話になっています。 ただ今困った事象が発生していて、お知恵をお借りしたく、投稿させて頂きます。 サーブレットで CSV データを作成し、直接データをダウンロードさせたいのですが、 OSが「WindowsXP SP1(SP2では未確認)」だと、ファイルのダウンロードダイアログで ”開く”を選択すると、同じダイアログが 2度表示されてしまいます。 (2度とも”開く”を選択すると、問題なくファイルは開かれます) ”保存”を選択した場合は2度は表示されません。 また、「Windows2000」の場合はこのような現象は発生しません。 ソースの要所は以下のようになっています。 response.setContentType("application/x-download;charset=Windows-31J"); response.setHeader("Content-Disposition", "attachment; filename=\"***.xls\""); 上記の1行目の「x-download」は「octet-stream-dummy」「msexcel」で 試してみましたが、結果は変わりませんでした。 また、2行目の「attachment」を「inline」にすると、 2度ダイアログが表示されるのは回避できますが、”開く”を選択すると ブラウザにExcelファイルの内容が表示されてしまいます。 もしかするとプログラムではなく端末の設定の問題かもしれませんが、 手元には2000とXPが1台づつあるだけなので、 これもなんともいえません。 どなかた解決方法をご存知の方がおられましたら、 御教授頂けますでしょうか。 よろしくお願いします。