- PR -

この入力ストリームはクローズされています

投稿者投稿内容
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2002-10-14 14:11
servletでアップロードされたファイルを読み込む
以下のようなBeansを作成しているのですが、
byte b=dis.readByte()の行でこの入力ストリームはクローズされています
と例外がスローされてしまいます。
いろいろ調べたのですが、答えが見つかりません。
ご教授願います。
環境はWindows2000 server、jdk1.3.0_02、j2sdkee1.2.1、Tomcat4.0.4です。

public class Multipart_Beans {

private DataInputStream dis;
private HttpServletRequest req;
private byte[] buffer;

public Multipart_Beans(HttpServletRequest req) throws IOException {
this.req = req;
dis = new DataInputStream(req.getInputStream());
ByteArrayOutputStream bao = new ByteArrayOutputStream();
boolean flag=true;
while(flag) {
try {
byte b=dis.readByte();
bao.write(b);
} catch(EOFException e){
flag=false;
}
}
buffer=bao.toByteArray();
parseData();
}

......
}
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2002-10-15 00:27
ソースすべてを見ているわけではないので勝手な想像ですが、
ServletRequest.getParameter() などの、読み込み系の関数を、
すでに使っているというパターンではないでしょうか?

引用してくださった部分の外に原因があるのではないでしょうか。
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2002-10-15 08:10
yuさんありがとうございます。

もしかしたらやってるかもしれません・・・(-_-
ソースを見直してみます。
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2002-10-17 02:09
ソースを見直して見たのですが、やはりすでに読み込んでいました・・・
しかし、この読み込み系を削除するわけにはいかなかったので、
読み込む前に別名のHttpServletRequest 読み込む前に別名の
HttpServletRequest に代入して、それを引数としてに代入して、
それを引数として渡してみたのですが、同じ結果になりました。
他になにか考えられるでしょうか?

引用したソースはサーブレットで
Multipart_Beans mb = new Multipart_Beans (Request);
で一番最初に処理する部分なので、引用以外のところに起因するかは
考えずらいのですが・・・

よろしくお願い申し上げます
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-17 09:34
ファイルのアップロードと同時にテキストデータもサブミットしている
のでしょうか。
だとすると自分で解析するしかない気がします。
getParameterとgetInputStreamは相容れないとjavadocに書いてありました。

http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/programming/howtoupload.html
ここあたりが参考になるかもしれません。

もし外部のライブラリを使用できるのならば
http://www.servlets.com/
とかstrutsなどがアップロードデータ解析ライブラリを
持っていますので検討の価値はあるかもしれません。
使えなくても、ソースは参考になるんじゃないでしょうか。
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2002-10-17 18:00
引用:

http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/programming/howtoupload.html
ここあたりが参考になるかもしれません。



絵と文章が凄まじい。それだけで一見の価値ありかも。

引用:

自分で解析するしかない気がします。
getParameterとgetInputStreamは相容れないとjavadocに書いてありました。



僕も、そう思います。getInputStream から直接解析するしかないのではないでしょうか。

まぁ、どうでも良いんだけど、
でも、このServletの制限ってServlet実装者のプログラミングが楽だからっと言う勝手な都合ではないでしょうか。絶対に、絶対に「相容れなくしない」ということが無理だとは僕には思えない。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-10-17 20:12
>>getParameterとgetInputStreamは相容れないとjavadocに書いてありました。

>でも、このServletの制限ってServlet実装者のプログラミングが楽だからっと言う
#別にServletの制限じゃないと思いますが...

>勝手な都合ではないでしょうか。絶対に、絶対に「相容れなくしない」ということが
>無理だとは僕には思えない。

パラメータの自動解析とバイナリストリームが混在することを許すと,
まず,セマンティクスが定義できますかね.
#HTTPの仕様を熟知してるわけではないので断言できない.

それに,定義できたとして,そのことによって入力データのコピーを
常に保存せねばならなくなって,パフォーマンスとかの面で不利に
なったりしませんかね?

いずれにせよ,やりたければバイナリレベルでゴリゴリ書くのは勝手なんだし,
それこそ混在させることのメリットの方が疑問に思ったりします.
#できるできないだけで判断すると,大抵のものは「できる」に
#分類されるのが情報の世界.ただ,その「できる」ものが,
#後で悲惨な結果に繋がることも少なくない....

#C++なんて「なんでもできる」という致命的な欠陥がありますから.
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2002-10-20 23:58
返答が遅くなってしまい、申し訳ございません。

引用:

http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/programming/howtoupload.html
ここあたりが参考になるかもしれません。




教えてくださった上記のサイトを確認し、ファイルをダウンロードしてアップロードできるか確認したところ、「このストリームは2回クローズできません」みたいな例外が返されました・・・

また、Beansに渡す前に読み込みを回避するために、
public void doPost(HttpServletRequest req,HttpServletResponse res)
throws IOException, ServletException{
HttpServletRequest request = req;
    ///////////以下省略///////////
}

のようにし、Beansにはrequestを渡しています。
これで試しても、ストリームは閉じていると例外を返します。
どちらにしても、再度JavaDocを読み直そうとは思っているのですが、
全く原因がつかめません。JDKなどのヴァージョンに起因したりもするのでしょうか。

よろしくお願い申し上げます。

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