• ベストアンサー

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

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

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

  • ベストアンサー
  • 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に書込む時に チェックしたかったいのですが。。。。 内容の伝わらない文章で申し訳ないです。