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

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

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

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

  • 回答数5
  • 閲覧数1789
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.5

>response.getOutputStream()してOutputStreamに >writeしてcloseするとこの場合はjsp側で値の >取得ってできないのでしょうか? OutputStreamに書き込み if(チェックエラー) {  エラーJSPに遷移 } という処理をお考えなら、request.setAttribute()とrequest.getAttribute()が正常に動作するかは使用するアプリケーションサーバによって異なると思います。また、#2にも書きましたがこのときのJSPの出力(エラーメッセージ?)はブラウザが正常に処理できるとは限りません。 ブラウザのダウンロード画面に「結果確認表示」のようなボタンをお用意しておき、ダウンロード後にJSPにアクセスさせる形式なら、チェック結果はrequestではなくsesseionに格納してください。requestはブラウザからリクエストがあるたびに生成されます。ダウンロードのリクエストでrequest.setAttribute()したものは、次のリクエスト(上記の「結果確認表示」を押下したときにブラウザから出されるリクエスト)では保持されていません。

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

質問者からのお礼

何度ものご回答ありがとうございます。 #5でのご回答を受けて処理を作ってみました。 やはり一度ダウンロードしてからボタン等の アクションでチェック結果を受け取る方法な らなんとかなるようでした。 要は、ダウンロードを行うサーブレット内で jspへの返却、jspで値取得はできないようでした。 ありがとうございました。 ペコリ(o_ _)o))

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • ServletOutputStreamについて

    Streamについて質問です。   サーブレットより、サーバにあるファイルを読み、 それをクライアントでブラウザから表示させようと 思っているのですが、 ファイルが破壊されているためファイルを表示できない。 といった、エラーが出てしまいます。   処理の一部としては ======================================= /* pdfのデータを取得しJSPで表示させる */   // getDataよりサーバファイルをバイト配列で取得 byte data[] = getData(); ServletOutputStream sos = response.getOutputStream(); sos.write(data); sos.flush(); sos.close(); ======================================= のようにしているのですが、JSPで Content-type = "application/pdf" を指定しても、AdbeReaderは起動しますが、 ファイルが壊れているのエラーが出て表示されません。 JPGファイルでは成功したのですが、なぜでしょうか…。   サーブレット内部でFileOutputStreamを使って 同じバイト配列に対してファイルを作成すると、 問題なくサーバにファイルが作成され見ることが できるのですが、JSPで表示させると失敗してし まいます。 正直、不明です。 何か原因のヒントとかあったら教えてください。  

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

その他の回答 (4)

  • 回答No.4

>inからoutにwriteするときに >チェックしたくて。。。 x = in.read() から out.write(x) までの間でxをロストするんですか??ロストするほど変なロジックを間に書くとは思えないんですが…。 読み込むファイルのサイズとwriteしたbyte数の比較を行いたいのであれば、File#length()を使ってファイルサイズをあらかじめ取得しておいてから、while文の中でカウントアップしたものと比較する方法がありますが…上記の質問の意図とは違いますよね? 何らかの例外が発生しているのならThrowableでまとめてキャッチするほうが簡単ですし、writeした結果が(アプリケーションサーバの出口まで)ちゃんと届いているかはJava上ではチェックできないです。

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

質問者からの補足

度々のご回答ありがとうございます。 もう一つ質問させてください・・・ チェックに関してはなんとかできそうなのですが そのチェック後にjspにそれを返してあげたいの ですが、writeしてcloseしたあとにrequestの setAttributeでセットしてjspでgetしたいのです がgetしてもnullしかはいってきません。。。 response.getOutputStream()してOutputStreamに writeしてcloseするとこの場合はjsp側で値の 取得ってできないのでしょうか?

  • 回答No.3

> ファイル作成 → ファイルをあるフォルダに > 配置 → そのファイルのフルパスでファイル > オブジェクトを作成 → そのファイルを > ダウンロードするサーブレットを作成 >  → この時にresponseのデータ部の > OutputStreamに書込みを行う事でブラウザが > 開く、保存、キャンセル等のメッセージを表示 > > 上記のresponse内のOutputStreamに書込む時に > チェックしたかったいのですが。。。。 「書き込むときに」というのは、書き込む前にですか? だとすれば、書き込む元ネタのFileオブジェクトとは、 チェック時の正となるFileオブジェクトと 同一のインスタンスってことになりませんか? だとしたらチェックの意味がないような。 「書き込んだものをチェックしたい」ということなら 書き込んだ時点で(closeしてからでしょうけど) 流れていってしまうので、もう遅いですし。

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

質問者からの補足

再度のご回答ありがとうございます。 > 書き込む元ネタのFileオブジェクトとは、 > チェック時の正となるFileオブジェクトと > 同一のインスタンスってことになりませんか? そうなんですよね~。。。 でも実際にその書き込む時点で ファイルのデータがロストしてる可能性が あってその場合にメッセージをだしたいんです。 実際のソースをのせますね。 BufferedInputStream in = new BufferedInputStream(new FileInputStream(ファイルパス)); BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); int x; while((x=in.read()) != -1){ out.write(x); out.flush(); } in.close(); out.close(); としていてinからoutにwriteするときに チェックしたくて。。。 できないのかな・・・

  • 回答No.2

osumitanさんもおっしゃってますが、クライアントにあるファイルのチェックは  1.クライアントに目で確認してもらう  2.クライアントからアップロードしてもらう のどちらかを行わない限りはできません。 1は、ファイルサイズやファイルハッシュをダウンロード画面に表示しておき、目で確認してもらうことになります。(ファイルハッシュは算出用のアプリケーションがクライアントサイドに必要です) 2は、アップロードを行ってもらい、ファイルそのものやファイルサイズ、ハッシュなどをサーバ上でチェックします。ただし、ダウンロード時に破損したのかアップロード時に破損したのかは区別できません。 つまり、自動チェックするにはクライアントの代わりに1か2を行うダウンロード専用のアプリケーションが必要になります。 >JSPでalert表示を行いたい ダウンロードの開始後には、HTMLを返しても正常に処理できない可能性が高いです。返したHTMLがダウンロードファイルの最後にくっついて出力されるなどされることが多いので、これはやめたほうがいいです。 実現性を考えると、クライアントにワンアクション起こしてもらう方法になるでしょう。

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

質問者からのお礼

ご回答ありがとうございます。 質問の内容がうまく伝えられなかったようです。。。 m(_ _;)m !! osumitanさんのお礼欄に補足的な事を書いたのですが もしよろしかったら参照してアドバイスなど いただけると。。。助かります。 乱雑な文章で申し訳ないです。。。

  • 回答No.1

> なので実際のファイルとダウンロード時のファイル > の違いがあった場合はJSPでalert表示を行いたい > のですが、うまく実行できません。 サーバ側のファイルとクライアント側のファイルを 比較するのは難しいんじゃないでしょうか。 比較できるってことは、正しいファイルがすでに クライアント側あるってことですよね。 (ファイルハッシュとかでの比較は可能かもしれませんが) > 処理としては > > response.setHeader(......) > response.setContentType(......) > > 等の設定を行い > > ダウンロードするファイルのInputStream > を作成、OutputStreamにgetOutputStream() > を取得してwriteしています。 closeを忘れているとかってことはないですか?

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

質問者からのお礼

ご回答ありがとうございます。 私の質問の仕方が悪かったようです。 m(_ _;)m !! ファイル作成 → ファイルをあるフォルダに 配置 → そのファイルのフルパスでファイル オブジェクトを作成 → そのファイルを ダウンロードするサーブレットを作成  → この時にresponseのデータ部の OutputStreamに書込みを行う事でブラウザが 開く、保存、キャンセル等のメッセージを表示 上記のresponse内のOutputStreamに書込む時に チェックしたかったいのですが。。。。 内容の伝わらない文章で申し訳ないです。

関連するQ&A

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

    サーブレット内で、ファイルのダウンロードをした後に処理をJSPへフォワードしたいのですが、現在、ダウンロードしたあとフォワードしてもJSPが機能しなくて困りました。 コードとしては以下の通りです(一部抜粋ですみません) /* ファイルダウンロードの設定 */ response.setContentType("application/octet-stream; charset=Shift-JIS"); response.setHeader("Content-disposition","attachement; filename= "+sgy_y+sgy_m+"_"+simekbn+".csv"); PrintWriter pw = response.getWriter(); /* CSVファイル出力 */ pw.println("あああ,いいい,ううう,えええ,おおお"); pw.println("かかか,ききき,くくく,けけけ,こここ"); pw.println("さささ,ししし,すすす,せせせ,そそそ"); pw.close(); /* JSPへフォワード */ getServletConfig().getServletContext().getRequestDispatcher("/xxx.jsp").forward(request,response); 何か良いアドバイスがありましたら、宜しくお願いします。

    • ベストアンサー
    • Java
  • ダウンロードが正常終了するけど件数が少ない。。。

    こんにちわ。 サーブレットであるファイルをダウンロードしようとしたら 実際のファイルの半分程度しかダウンロードできませんでした。 ちなみにアクセスログ上はダウンロード失敗等のエラーもでていません でした。。。 回線が途切れたわけでもないのにこのような現象が起こりえるのでしょうか? response.setHeader("Pragma", "private"); response.setHeader("Cache-control", "private"); response.setHeader("Content-Disposition", "inline; filename=\ファイルパス\"); response.setContentType("text/*; encoding=Shift_JIS"); の様な感じです。。。。 まず、HTTP上で消える、切れる等が起こりえるのでしょうか? どなたか経験のある方がいらっしゃればよろしくお願いします。

    • ベストアンサー
    • Java
  • ダウンロードサーブレットでキャンセル時のエラー

    ファイルをダウンロードさせるservletを以下のソースのように作っています。 ブラウザ側で「ファイルの保存ダイアログ」の「キャンセル」を行われた際に以下のようなエラーが表示されます。 エラーを回避する方法、あるいは対処の方法はあるのでしょうか?どなたかご教授下さい。 環境:Windows XP,Tomcat 5.0.28,IE 6.0 ソース(一部) --------------- String fileName1= rs.getString(1); InputStream data = rs.getBinaryStream(2); String contentType = rs.getString(3); String fileName2 = URLEncoder.encode(fileName1,"UTF-8"); //contentTypeを出力 response.setContentType(contentType); //ファイル名の送信(attachment部分をinlineに変更すればインライン表示) response.addHeader("Content-disposition","attachment; filename=\""+fileName2+"\""); //ファイル内容の出力 ServletOutputStream out = response.getOutputStream(); //InputStream fin = new InputStream(fileName2); int size; while((size = data.read(buffer))!=-1){ out.write(buffer,0,size);  //←エラー発生箇所 } data.close(); out.flush(); out.close(); エラー -------------- ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.coyote.tomcat5.OutputBuffer.realWriteBytes(OutputBuffer.java:373) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:398) ・・・

  • 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
  • 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初心者なので、よくわかっていないかもしれませんが、 宜しくお願い致します。

  • ファイルのダウンロード先を初期設定するには?

    サーブレットにファイルをダウンロードする機能を入れたいと思って います。 現在、HttpServletResponseオブジェクトを使用して下記のようにコー ディングしています。 ============================================= response.setHeader("Content-Disposition", "attachment;filename=sample.xls"); response.setContentType("application/vnd.ms-excel"); ============================================= これで問題なくダウンロードは出来るのですが、ダウンロード先の初期 表示をブラウザ(現在、IEを使用してます)に依存するのではなく、予 め指定したフォルダを初期表示して欲しいとの要望がありました。 ダウンロード先を初期設定するとはいえ、ユーザーが自由にファイル名 やダウンロード先を指定する機能は必要なので、FileOutputStreamを使 用してのファイルの保存は考えていません。 どのようにすれば、実現するのでしょうか? また、ファイルのダウンロード先を初期設定することは可能なのでしょ うか? それさえ判断が出来ずに困っています。 もし絶対に無理!ということであれば、それを教えて頂けるだけでも助 かります。

    • ベストアンサー
    • Java
  • 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
  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 response.setContentType("text/html;charset=Shift_JIS"); の部分があるのですが、このようにすると日本語が文字化けしてしまいます。 ちなみにresponse.setContentType("text/html); とすると、日本語も文字化けせずに正しく表示されます。 ここで質問なのですが、 サーブレットの場合はJSPと違い、charsetを指定しなくてもよろしいのでしょうか? 何か分かることがありましたらご教授御願い致します。 ---------☆サンプルソース(HelloWorldExample.java)☆---------------- import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>ハローワールド</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>HelloWorld ハローワールド</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } } ---------------------------------------------------

    • ベストアンサー
    • Java
  • InputStreamはreadが1回しかできない?

    1つのFileInputStreamのクラスから2つのFileOutputStreamのクラス (仮にOutputStream1、OutputStream2とします)へwriteし、 ファイル2つを作成しようとしています。 最初にOutputStream1へwriteし、次にOutputStream2へwriteしたとき、 両方のStreamで作成したファイルが空(0KB)の状態になってしまいます。 1つのInputStreamから連続して2つ以上のOutputStreamに書くことはいけない ことなのでしょうか?(どうしてもやりたいのですが) もしかしてFileInputStreamの完全なコピー(cloneじゃなくシリアライズして 複製を作成する)を作る方法しかないのでしょうか?とはいうものの シリアライズできるInputStreamクラスを作成できず困っていたりします。 (あとOutputStreamをInputStreamに変換できたらなぁとかも思うの  ですが無理ですよね・・・?) どなたかご存じの方、是非ご教授下さい。

    • ベストアンサー
    • Java
  • サーブレットからIMGタグへ画像が送れない

    Apache1.3.26とTomcat4.0.6でjava1.4でIEに画像を表示するシステムを開発しています。 Tableタグで構成した表内に、サーブレットをリンク先としたIMGタグを3つ記述してあります。   <tr><td>     <img src='../servlet?param='aa''></a>   </td><tr/><tr><td>     <img src='../servlet?param='bb''></a>   </td><tr/><tr><td>     <img src='../servlet?param='cc''></a>   </td><tr/> このタグ内に記述しているサーブレットでは、DBより取得したパスを元にJpegファイルを 読込み、レスポンスに渡しています。   response.setContentType("image/pjpeg");   response.addHeader("Content-Disposition","inline; filename=" + fileName);   InputStream in = null;   OutputStream out = null;   try {     in = new FileInputStream(ImagePath);     out = response.getOutputStream();     int b;     while ((b = in.read()) != -1) {       out.write(b);       break ;     }   } finally {     if (in != null) {       in.close();     }     if (out != null) {       out.flush();       out.close();     }   } IEにこのHTMLを表示させると、ほとんどの場合はJpeg画像が表示されるのですが、 まれに表示されずに×印が出てしまうことがあります。 右クリックメニューより「画像の表示」を行うと表示されますが、ページを表示した際に表示されていないと使えるシステムとなりません。 何が原因なのかわからず、対処のしようがない状態です。 どなたか原因、対処方法についてご教授いただけないでしょうか?

    • ベストアンサー
    • Java