- PR -

excelファイルの表示ができません。t.t

1
投稿者投稿内容
タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 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/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 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/03/17
投稿数: 138
投稿日時: 2004-04-08 15:43
いっきゅう様
有難うございます。

本当に成功しました。

でもなぜなんでしょう。
なんとなくは分かるような気がしますが。。。
nullにセットしなきゃだめですか?
少し気になりますが。。。

とにかく解決できたので100点満点差し上げます。

aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-04-08 19:15
引用:

nullにセットしなきゃだめですか?
少し気になりますが。。。


GCの対象とするためですね。

引用:

とにかく解決できたので100点満点差し上げます。


失礼ですが、あなたは親切にも教えてくれた人を馬鹿にしているんですか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-04-08 19:43
余談ですが、flush や close してしまうと keepalive 接続ができなくなりますのでパフォーマンスに影響を与える可能性があります。
可能な限りバッファやコネクションの管理はサーバにまかせると良いです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-04-08 19:50
引用:

aaさんの書き込み (2004-04-08 19:15) より:
引用:

nullにセットしなきゃだめですか?
少し気になりますが。。。


GCの対象とするためですね。


ミミさんが何が「気になる」のかはわかりませんが、通常ローカル変数にnullを設定する必要
はありませんね。また、インギさんが書かれたとおりコンテナによっては(WebLogicなど)は
明確にレスポンスのストリームをクローズしないことを推奨しています。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-04-09 10:13
なぜかしら誰も言及していませんが、

InputStream#available は、「その時点で即座にread可能なバイト数」を返してきます。
パイプやソケットが相手の場合は、この値はファイルサイズと一致しません。
最初のミミさんのコードが上手くいかなかったのは、そのせいです。

正しく処理するには、いっきゅうさんのように「EOFに達するまでreadを繰り返す」
必要があります。
1

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