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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qダウンロード支援フリーソフトについて

ダウンロード支援フリーソフトについて
色々なダウンロード支援フリーソフトを試しましたが私の設定が良くないのか私の思うようにダウンロード出来ません、おすすめのダウンロード支援フリーソフト・設定を教えてください。

用途としてはインターネットのページ上でサムネイル化されている画像を大きいサイズで保存したいのです、上記のとおり一通りフリーソフトを試しましたがサムネイルサイズの小さい画像しか保存できず困っています。

フリーソフト等を使ってサムネイル化された画像を元々のサイズで保存する方法はないのでしょうか?出来るのなら出来るフリーソフト・設定を教えて下さい。

質問内容が分かりにくく大変申し訳ありません。

Aベストアンサー

そのサムネイルは大きい画像へのリンクになっていますか?

小さいサムネイル画像しか持たない(リンクしていない)画像だったらどんなソフトを使っても小さな画像しか得られませんので

http://www.flashget.com/index_jp.htm

Qwindows 環境でのファイル操作について

今作成しているjavaのアプリケーションがあるのですが、
うまく動きません。
ファイルサーバにアップロードされるファイルを数秒間ごとに
監視し、アップロードされれば自動で別のディレクトリにコピ
ーするというアプリケーションを作成しております。
で、MAC osX server上で動かすと正常に動くのですが、
Windows 2000 server上だと正常に動きません。

プログラムの流れとしてはFile型のorigオブジェクト(元ファイル)
と、File型のcopyオブジェクト(移動先のファイル)を用意し、
BufferedInputSteramで読み取って、BufferedOutputStreamで
書き出す、というものです。

うまく動かない箇所は、origファイルがまだアップロード中で
ある場合そのファイルに対してFileInputStreamを用意しようと
すると、FileNotFoundExceptionが発生するだけでなく、その
ファイルが消去されてしまうのです。恐らくはJavaではなく、
OSがコピーエラーが発生したかのように扱ってしまい、ファイル
を消去してしまうのではないかと思っているのですが。(osXでは
動くので)

FileInputStream fis = new FileInputStream(orig);
この行で例外発生!ファイルが消える。

そこでFileInputStreamを用意する前に、そのファイルがコピー中
であるのか、コピーが終わっているのかを調べることができるの
でしょうか、というのが私の質問です。あるいは、全く違った側面
からの回避策でも結構です。
ちなみにorig.exists()はアップロード中であってもtrueが返され
ます。

javaはプラットホームに依存しないと信じてたのに大きな落とし穴
でした。以下にソースの一部を記述しておきますので、よろしく
おねがいします。

今作成しているjavaのアプリケーションがあるのですが、
うまく動きません。
ファイルサーバにアップロードされるファイルを数秒間ごとに
監視し、アップロードされれば自動で別のディレクトリにコピ
ーするというアプリケーションを作成しております。
で、MAC osX server上で動かすと正常に動くのですが、
Windows 2000 server上だと正常に動きません。

プログラムの流れとしてはFile型のorigオブジェクト(元ファイル)
と、File型のcopyオブジェクト(移動先のファイル)を用意し、
BufferedInputStera...続きを読む

Aベストアンサー

気になったんでちょっと試してみました。
環境は違うんですが、おそらく同じような結果が得られました。

環境:WindowsXP
JVM:JDK1.3.1_02

コピー中のファイルに対しては確かにexistsがtrueになりました。
InputStreamを取得すると、

java.io.FileNotFoundException: test.txt (プロセスはファイルにアクセスできません。別のプロセスが使用中です。)

という例外がthrowされました。
ここまで同じような結果が得られるのですが、
私が試した結果ではファイルは消えません。そのままコピーが継続されました。

例外が発生したときに何かしていますか?
ファイルが消えてしまうのは何か別の原因ではないでしょうか?

Qフリーソフトをダウンロード,なのに有償版のアイコンがある…

お教えください。

ラスター・ベクター変換で
http://www.softsoft.net/wintopo/dl-wintopo.htm
という英国のWinTopo Freeware 1.7というフリーソフトをダウンロードしました。

ですが,インストールを終えてみるとWinTopo Freeware 1.7のフリーソフトとWinTopo Professionalの有償版のアイコンがうまれているのです。

どこかで間違った手続きをしたのでしょうか?

特に変わったこともなくダウンロードして,インストールをしました。 

そして,サイトがすべて英語なのでわかりづらくて困っています。

フリーソフトのみをダウンロードしたつもりなのにWinTopo Freeware 1.7のフリーソフトとWinTopo Professionalの有償版のアイコンがあることや,間違いダウンロードをしてしまったかもしれないということについて尋ねたくてもどうしてよいかわかりません。

これは請求されるのでしょうか?

もし,ダウンロードミスをしていた場合,これは間違 いダウンロードだとしてダウンロードを返上,撤回す るのはどうすればよいでしょうか?

お教えください。

ラスター・ベクター変換で
http://www.softsoft.net/wintopo/dl-wintopo.htm
という英国のWinTopo Freeware 1.7というフリーソフトをダウンロードしました。

ですが,インストールを終えてみるとWinTopo Freeware 1.7のフリーソフトとWinTopo Professionalの有償版のアイコンがうまれているのです。

どこかで間違った手続きをしたのでしょうか?

特に変わったこともなくダウンロードして,インストールをしました。 

そして,サイトがすべて英語なのでわかりづらくて困ってい...続きを読む

Aベストアンサー

正常です。

私もインストールしたことがありますが、たしかその有償版は期間限定だか機能限定だかの試用版のはずです。
一緒にインストールされる旨どこかに書かれていたと思います。

QクライアントPCからサーバーへのアクセスする場合のURL指定について

Eclipseを使用してwebアプリケーションを開発しています。
開発環境はクライアントOS:winXP
Eclipse2.1.3
Tomcat4.1
J2SDK1.4です。
本番環境のサーバーOSはwin2000です。

開発を一通り終えて、本番サーバー側の設定および、モジュール(warファイル)コピーも完了しました。
確認のため、クライアントからサーバーへアクセスしようとしていますが、画面が表示されません。

開発時には http://localhost:8080/webアプリケーション開発ディレクトリ を指定することにより画面確認できました。

「localhost:8080」の指定を変更すればよいと考えていますが、この考えでよいでしょうか?

よろしくお願いします。

Aベストアンサー

IPアドレスを指定すればうまくいくと思います。
本番環境もTomcatを使用しているなら、
http://IPアドレス:8080/webアプリケーション開発ディレクトリ

で良いと思います。

Q「着もと」というフリーソフトのダウンロードサイトが開けなく、ソフトがダ

「着もと」というフリーソフトのダウンロードサイトが開けなく、ソフトがダウンロードできません。
着もとのように着信音設定を可能にするフリーソフトがあれば教えていただけないでしょうか?

Aベストアンサー

http://www.vector.co.jp/soft/dl/winnt/art/se460732.html
ここからどうぞ

Qブラウザの表示領域から高さを指定、ブラウザを動かしても可変させたい。

ブラウザの表示領域から高さを指定、ブラウザを動かしても可変させたい。

ブラウザのスクロールバーのように、
ブラウザの表示領域を取得してdivのボックスのサイズを取得して、
それに合わせてボックスの高さを指定し、
overflow:autoでスクロールバーが出るようにしたいと考えております。
サイズの取得までは.clientHeightを使ってできたのですが、
表示後にブラウザを動かすと合わせて可変するようにすることができず困っております。


上記を実現する方法がおわかりの方がいらっしゃれば、
是非ご教授いただければと思います。

Aベストアンサー

No1です。

ご提示のコード(No1の補足)では、単に以下のようなCSSを作成しているだけです。
  <style type="text/css"> .hoge { height:○○px; } </style>
○○の部分は数字で、document.allがある場合(IE)はbodyの高さ、そうでない場合でモダンブラウザならinnerHeightが入ることになります。
後半がいきなりinnerHeightになっているので、対象が何か不明です。(なんだかおかしいですね)
innerHTMLは通常は属性なのでそのもととなる要素があるはずなのですが、ご提示のコードではそれがありません。(withで指定?)あるいは、考えにくいことですが、innerHTMLをローカル変数に使っているとするならどこかで値を代入しているはずで、その部分が提示されていないので不明です。
さらに言うなら、その場合分け自体がすでに古い場合分けの方法なので、現状にあっているのか少々疑問です。


>今回jScrollPane.jsというjavascriptでスクロールバーをカスタマイズしており、
>上記方法では最初のサイズで固定されてしまい、
ご提示のコードだと「○○px」と数値で指定していますので、ご質問の通り固定サイズになっています。
No2様が示されているように、%指定などの相対指定にしておけば、リサイズされても相対的に変化してくれるので、何もしなくてもOKということになります。
ただし、 .hoge { height:100%; } とした場合、該当する要素がどのように構成されているかによって、実際のサイズが決まるので、ご提示の情報だけからではわかりません。
でも、相対指定を利用することで解決できる可能性はありそうですね。


No1で説明した方法ですと、同じルーチンを再実行するのではうまくいきません。(回答時に、document.writeを使っているなんて予想していなかったので)
正攻法でいくならリサイズイベントが発生した時に、スタイルシートを取得して、.hogeの記述を探し、あったらその内容を変更するという少々面倒な処理を追加することになります。
それよりはclass="hoge"の要素(スクリプトで生成される要素?)が都度生成されるものではなく、常に決まっているのであれば、そちらのスタイルを直接変更してしまったほうが簡単です。要素が可変(後で生成されるなど)の場合はスタイルシートを変更するしかないかも。

いずれにしろ、CSSだけで解決できるのなら、そのほうが遥かに簡単です。

No1です。

ご提示のコード(No1の補足)では、単に以下のようなCSSを作成しているだけです。
  <style type="text/css"> .hoge { height:○○px; } </style>
○○の部分は数字で、document.allがある場合(IE)はbodyの高さ、そうでない場合でモダンブラウザならinnerHeightが入ることになります。
後半がいきなりinnerHeightになっているので、対象が何か不明です。(なんだかおかしいですね)
innerHTMLは通常は属性なのでそのもととなる要素があるはずなのですが、ご提示のコードではそれがありません。(with...続きを読む

Qベクターのフリーソフトがうまくダウンロードできない

ベクターのフリーソフトを手順どうりダウンロードして 解凍ソフトを重ねて
解凍してみると何故か全て、エキサイト壁紙マネジャーの絵になります。
どんな、フリーソフトをダウンロードしても全部 壁紙マネジャーになるのです
なぜでしょうか?教えてください

Aベストアンサー

壁紙マネジャーを終了してから ダウンロードしてみては いかがでしょうか?
そのソフトが 余計なことをしているのかもしれません。

Qwindows上のeclipse開発環境からlinux上のjavaを動かすには

いつもお世話になっております。
linux上でしか動かない一部C言語が使われているjavaの部品があります。

こちらをwindwosの開発環境から呼び出すしたいのですが、何か方法はありますでしょうか。
C言語の部品は他の業者が開発しており、windowsで動くようにしてもらうのは難しいです。

javaの部品は引数String型、戻り値String型になっています。
こちらをリモートで起動する事が出来ますでしょうか。

よろしくお願いします。

Aベストアンサー

> linux上でしか動かない一部C言語が使われているjavaの部品

この辺がよくわかりませんが、
サーバーに対してクライアントが呼び出すという形にすれば何でもいけます。

最近の流行で言えばWebサービスでしょうか。
別にWebサービスに限らずただのWebサーバーでも良いでしょう。
RMIなんかだと準備やソースコードは少なくてもいいようにできるかもしれません。


HTTPサーバーを立ち上げて、クライアントからはブラウザとかで
HTTPサーバーにアクセスし、それをきっかけに
「linux上でしか動かない一部C言語が使われているjavaの部品」
とやらを呼び出してやればOKです。

慣れもありますがRMIよりもWebサーバーのほうがイメージしやすい様に感じます。

RMIについて
http://ash.jp/java/rmi.htm

Qベクターのあるフリーソフトのダウンロード法

訳があって デザインした文字をTシャツに昇華プリント加工する必要に迫られ しかも「立体文字」を
デザインする必要に迫られ ウェブサイトをさまよってると ベクターのフリーソフト「もこもこ」なるサイトに出会いました。
http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005196.html
フリーソフトと分かって 喜びいさんでダウンロード
しようとして うまくダウンロード出来ません。
ウェブ上の「ダウンロード」の項をクリックしても
うまくダウンロード出来ません。
実は ベクターのフリーソフトをダウンロードした
経験ゼロです。ひょっとして 事前の会員登録制?
なのでしょうか。
どなたか 御教示 お待ちしています。
PS。「ラーサプラス」なる解凍ソフトは
   インストール済みです。

Aベストアンサー

最近「Vアップ通知」なるサービスが開始され、ダウンロードを開始する前に、そのサービスの案内ページが挿入されるようになりました。
このページで「登録するとバージョンアップの連絡…」などの文面があるのでそれで迷われたのでしょうか?
案内ページの下にある「いまは登録しない」ボタンを押すととりあえずダウンロードが開始されますよ。

自分も変更直後に「登録が必要になったのか?」と勘違いし少しハマりました(^^;

Qwebブラウザからローカルファイルの読み込み

はじめまして、質問します。
webブラウザからローカルファイルの読み込みを行いたいのですが、
セキュリティーの問題でアクセスを拒否されました。
その回避法として、FileAPIによって
htmlのinput要素かドラッグアンドドロップを用いて
ローカルファイルを読み込めることが分かりました。

しかし、私がやりたいことは
絶対パスでローカルファイルを読み込むことです。

そのようなことは可能でしょうか?
上記の方法だとinputからフォルダをたどってファイルを選択するので
原理的には可能なような気がするのですが・・・・

言語はjavascriptです。
よろしくお願いします。

Aベストアンサー

>その回避法として、FileAPIによって
>htmlのinput要素かドラッグアンドドロップを用いて
>ローカルファイルを読み込めることが分かりました。

>上記の方法だとinputからフォルダをたどってファイルを選択するので
>原理的には可能なような気がするのですが・・・・

根本的な部分で勘違いをされている気がします。ドラッグ&ドロップで渡されるのはファイルのパスなどではありません。これはFileListオブジェクトという専用のオブジェクトで、その中に個々のファイルに関するFileオブジェクトが保管されています。このFileオブジェクトをFileReaderなどに渡すことでその内容を読み取ったり出来る仕組みになっています。

ただし、ここで勘違いしてはいけないのですが、このFileオブジェクトには、ファイルのパス情報は含まれていないのです。あるのはファイル名の情報だけ。そのファイルがどこにあるかといったことはJavaScript側からは隠蔽されており、スクリプトからタッチできません。

つまりJavaScriptでは、「パスによるファイルの指定」は過去も現在も首尾一貫して禁止されており、不可能なのです。

ドラッグ&ドロップは、ユーザーの能動的な動作により起こるイベントです。つまり、ユーザーが自分で「このファイルをアップロードしよう」といった具合に操作した結果の行動です。これに対し、「ファイルのパスによるファイルアクセス」は、ユーザー不在であり、プログラムが自分で勝手にファイルにアクセスできることを意味します。両者は全く違います。

>その回避法として、FileAPIによって
>htmlのinput要素かドラッグアンドドロップを用いて
>ローカルファイルを読み込めることが分かりました。

>上記の方法だとinputからフォルダをたどってファイルを選択するので
>原理的には可能なような気がするのですが・・・・

根本的な部分で勘違いをされている気がします。ドラッグ&ドロップで渡されるのはファイルのパスなどではありません。これはFileListオブジェクトという専用のオブジェクトで、その中に個々のファイルに関するFileオブジェクトが保管されています...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング