- - PR -
excelファイルの表示ができません。t.t
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-08 15:26
いつもお世話になっております。
別のPC(サーバー)にあるExcelファイルをこっちのサーバー(IE,tomcat)で表示したいですが。 最初の一、二回はできましたがその後からはエラーがでます。 エラーメッセージ: 'mso237AD.xls'にアクセスできません。ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。または、サーバー上に保存されているドキュメントから応答がありません。 こういうエラーです。 最初からできなかったら私が何かを間違って設定したと思いますが 最初のうちできたのに今はできなくなったのが不思議ですね。 何から調べてみればいいかも判らないのでまた質問しました。 いつもご迷惑かけて申し訳ありませんが よろしくお願いします。 私が書いたソースです。 res.setContentType("application/vnd.ms-excel; charset=Shift_JIS"); out = res.getOutputStream(); // パラメータ取得 String address = strURL + req.getParameter("NEXT");//excelファイル URL url; HttpURLConnection urlConn; url = new URL( address ); urlConn = (HttpURLConnection)url.openConnection(); urlConn.setRequestMethod("GET"); BufferedInputStream bi = new BufferedInputStream(urlConn.getInputStream()); int i = bi.available();//これじゃなきゃ動かなかったです。 byte[] buf = new byte[i];//定数を入れたら何も出ませんでした。 bi.read(buf); bi.close(); urlConn.disconnect(); out.write(buf); out.close(); よろしくお願いします。 | ||||||||
|
投稿日時: 2004-04-08 15:32
> int i = bi.available();//これじゃなきゃ動かなかったです。
> byte[] buf = new byte[i];//定数を入れたら何も出ませんでした。 > bi.read(buf); > bi.close(); > urlConn.disconnect(); > out.write(buf); > out.close(); 上記修正普通はこんな感じに書きます。 int length = 0; byte[] buf = new byte[1024]; while( (length = bi.read(buf, 0 , byte.length) > 0 ) { out.write( buf, 0,length ); } bi.close(); bi = null; out.close(); out = null; | ||||||||
|
投稿日時: 2004-04-08 15:43
いっきゅう様
有難うございます。 本当に成功しました。 でもなぜなんでしょう。 なんとなくは分かるような気がしますが。。。 nullにセットしなきゃだめですか? 少し気になりますが。。。 とにかく解決できたので100点満点差し上げます。 | ||||||||
|
投稿日時: 2004-04-08 19:15
GCの対象とするためですね。
失礼ですが、あなたは親切にも教えてくれた人を馬鹿にしているんですか? | ||||||||
|
投稿日時: 2004-04-08 19:43
余談ですが、flush や close してしまうと keepalive 接続ができなくなりますのでパフォーマンスに影響を与える可能性があります。
可能な限りバッファやコネクションの管理はサーバにまかせると良いです。 | ||||||||
|
投稿日時: 2004-04-08 19:50
ミミさんが何が「気になる」のかはわかりませんが、通常ローカル変数にnullを設定する必要 はありませんね。また、インギさんが書かれたとおりコンテナによっては(WebLogicなど)は 明確にレスポンスのストリームをクローズしないことを推奨しています。 | ||||||||
|
投稿日時: 2004-04-09 10:13
なぜかしら誰も言及していませんが、
InputStream#available は、「その時点で即座にread可能なバイト数」を返してきます。 パイプやソケットが相手の場合は、この値はファイルサイズと一致しません。 最初のミミさんのコードが上手くいかなかったのは、そのせいです。 正しく処理するには、いっきゅうさんのように「EOFに達するまでreadを繰り返す」 必要があります。 | ||||||||
1
