• ベストアンサー

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

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

  • Java
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.5

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

jk_beck
質問者

お礼

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

その他の回答 (4)

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.4

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

jk_beck
質問者

補足

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

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.3

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

jk_beck
質問者

補足

再度のご回答ありがとうございます。 > 書き込む元ネタの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するときに チェックしたくて。。。 できないのかな・・・

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.2

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

jk_beck
質問者

お礼

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

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

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

jk_beck
質問者

お礼

ご回答ありがとうございます。 私の質問の仕方が悪かったようです。 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
  • 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
  • ダウンロードが正常終了するけど件数が少ない。。。

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

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

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

    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
  • 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
  • Excelに時刻を入れたい

    はじめまして。 JAVA初心者です。 DBから取得したデータ「09:00」をExcelに入れようとしているんですが、表示された結果が正しくないのです。 DBからTimeタイプとして入れたら、セル値がシリアルになってしまう。 他、Stringとしたら、セル値にアポストロフィが付いてしまう。 今のところ解決方法はありません。 どうすれば、正しい結果(9:00)が表示されるのでしょうか。 教えていただけませんか? ついでに、既存エクセルの書式は「時刻」です。 ソースは以下の通りです。(Timeタイプとする) -------------------jsp ソース------------------ FileInputStream inputStream = null; FileOutputStream outputStream = null; File excel = new File("C:\\123123.xls"); inputStream = new FileInputStream(excel); HSSFWorkbook workBook = new HSSFWorkbook(inputStream); HSSFSheet newSheet = workBook.getSheetAt(0); HSSFRow newRow = newSheet.getRow(16); HSSFCell newCell1 = newRow.getCell((short) 6); java.sql.ResultSet rs = null; rs = DBtest.DBGetdate(); Time modifyTimeTemp = null; HSSFRow newRowtemp = newSheet.getRow(18); HSSFCell newCell1temp = newRow.getCell((short) 6); while(rs.next()){ modifyTimeTemp = rs.getTime("Time"); } //newCell1temp:正しく入力されたデータ newCell1.setCellStyle(newCell1temp.getCellStyle()); newCell1.setCellValue(modifyTimeTemp); try{ response.setContentType("application/msexcel"); response.setHeader("Content-Disposition", "attachment; filename=jsp.xls"); OutputStream outs = response.getOutputStream(); workBook.write(outs); outs.close(); }catch(Exception e){ e.printStackTrace(); }

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

  • ダウンロードについて

    jspに<a href="ファイル名">ダウンロード</a> でそのファイルをダウンロードできると思ってました。 (ダウンロードするファイルはjspと同じフォルダにあります。) が、「404ページが見つかりません」になります。 formにactionとmethod=postを指定してます。 jspは以下のような感じです。 <form action="アクション名" method="post"> <a href="./download.zip">ダウソ</a> </form> また、エクセルをダウンロードするのも同様にやると、 404になり、エクセルが起動し、ブラウザに内容が表示されたりすることもありません。 htmlに同じように書くとダウンロードの画面がでたり、エクセルが起動したりしてくれます。 過去の質問からサーブレットのresponseから、アウトプットストリームを取得し、エクセルの内容をそれに吐き出す?感じにするとダウンロード画面がでました。 <a href>だとダウンロードできないのでしょうか? どうすればできるのでしょうか? それと、アウトプットにwriteするやり方で、 res.setHeader("Content-Disposition", "attachment; filename=ファイル名"); で、ファイル名が日本語の場合、ダウンロードのファイル名が正しくないのですが、URLEncoderにはjavaのバージョンのせいか、encodeメソッドの引数が1つしかなく、エンコードを指定できず、ファイル名が意図しないものになるのですが、うまい解決法はないでしょうか? バージョン上げるのは無理ですけど・・。 よろしくおねがいします。

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

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

    • ベストアンサー
    • Java