- PR -

JSPを使ってFileをDownloadするには?

投稿者投稿内容
Kluger
会議室デビュー日: 2002/06/22
投稿数: 6
お住まい・勤務地: 大阪
投稿日時: 2002-06-22 18:45
SaturdayプログラマーのKlugerです。はじめまして。いつも勉強させていただいております。

Servlet+JSPを使って、サーバー上のファイル(とりあえずZip形式)をDownloadする仕組みを作ろうとしているのですが、IEのエラーが多発します。たいてい一回目の処理ではエラーになり、二回目以降は正常に処理されます。

次のようなエラーです。

『このインターネットサイトを開くことが出来ませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。』

JSPは下記のようなコードです。

コード:
<%@ page contentType="application/octet-stream" import="java.io.*" %>
<jsp:useBean id="Dload" scope="request" class="DloadBeans" />
<%
  String data_path = Dload.getFilePath();
  String data_name = Dload.getFileName();

  response.setHeader("Content-Disposition","attachment; filename="+data_name);
  response.setHeader("Content-Description","file download test");
  BufferedInputStream in = new BufferedInputStream(new FileInputStream(data_path + data_name));

  int x;
  while((x=in.read()) >= 0){
    out.write(x);
  }
  in.close();
  out.close();
%>



一回目のリクエストではFileが出来きれていないの?って感じかなぁと思うのですが、どなたか解決する方法やヒントをアドバイスしていただけないでしょうか?

よろしくお願いいたします。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2002-06-22 23:28
ファイルをストリームから読み込んで、それをレスポンスのストリームに
書き出しているんですか。。。

サーバのディスク上に存在するファイルにリダイレクトする方が
簡単だと思うのですが、あえてストリームへ書き出しているのには
理由があるのでしょうか?
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-06-22 23:52
Dload なるものがなんなのかわかりませんからどうにも。
あと、「1回目」「2回目」もよくわからない。何をしたあとの1回目?

それを除けば気になる点は3つ。

1.「改行」が入っている

<%page もげもげ%>←ここ
<...

タグの間にある改行文字も送出されてしまいますよ。
<%page もげもげ%><%--
--%><..
しときましょう。

2. out.close()

out.close() は、jsp の外側で行われるはずですから、へたにここでやらないほうがいいでしょう。

3. length は?

バイナリを送るなら、Content-Length も送っといた方がいいでしょう。

[ メッセージ編集済み 編集者: しょむ 編集日時 2002-06-22 23:54 ]
Kluger
会議室デビュー日: 2002/06/22
投稿数: 6
お住まい・勤務地: 大阪
投稿日時: 2002-06-22 23:58
Klugerです。さっそくの返答ありがとうございます。

引用:

YOU@ITさんの書き込み (2002-06-22 23:28) より:
ファイルをストリームから読み込んで、それをレスポンスのストリームに
書き出しているんですか。。。

サーバのディスク上に存在するファイルにリダイレクトする方が
簡単だと思うのですが、あえてストリームへ書き出しているのには
理由があるのでしょうか?



ちょっとだけセキュアにしたかったのです。
リダイレクトするってことは、ようするにhttpでアクセスできる場所に放置するってことですよね。誰でも取れる場所に置くのはちょっと心配なので、サーブレット側でコントロールをしたかったのです。
Kluger
会議室デビュー日: 2002/06/22
投稿数: 6
お住まい・勤務地: 大阪
投稿日時: 2002-06-23 00:05
Klugerです。早速のアドバイスありがとうございました。感激です。

引用:

しょむさんの書き込み (2002-06-22 23:52) より:
Dload なるものがなんなのかわかりませんからどうにも。
あと、「1回目」「2回目」もよくわからない。何をしたあとの1回目?

それを除けば気になる点は3つ。

1.「改行」が入っている

2. out.close()

out.close() は、jsp の外側で行われるはずですから、へたにここでやらないほうがいいでしょう。

3. length は?

バイナリを送るなら、Content-Length も送っといた方がいいでしょう。




Dloadは、サーブレット側からファイル名とファイルパスを引き渡しているだけなので、特に特別なことはしておりません。サーブレット側では、アクセスしてきた人がそのリソース(ファイル)に対してアクセス件があるかどうか確認しています。
改行は、ここにポストするときについちゃっただけなので、本当のコードは入れていません。あと、closeとlengthは試してみます。

ありがとうございました。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2002-06-23 22:58
そう言えば・・・

JSPの定義済みoutオブジェクトってJSPWriterですよね。
Writer系ってことはテキストを吐き出す為のオブジェクトではないですか?

Stream系のオブジェクトを取得して、それに書き出してみてはどうでしょう?
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-06-23 23:55
>JSPの定義済みoutオブジェクトってJSPWriterですよね。
>Writer系ってことはテキストを吐き出す為のオブジェクトではないですか?

おぉ〜、そういやそうだ。きづかなんだ。
Writer 作って Header 出力しちゃってるから Stream はひっこぬけないような気も…。
とか考えると、すなおに Servlet にした方がよいような…。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-06-24 08:14
>JSPの定義済みoutオブジェクトってJSPWriterですよね。
>Writer系ってことはテキストを吐き出す為のオブジェクトではないですか?

ダウンロード用出力にJSPWriterではなくjavax.servlet.ServletOutputStream
を使えばいいのでは??

スキルアップ/キャリアアップ(JOB@IT)