- PR -

テキストファイルのダウンロード(開く)ができません

1
投稿者投稿内容
MNM
会議室デビュー日: 2003/10/24
投稿数: 4
投稿日時: 2003-10-24 13:18
下にファイルのダウンロード機能についての質問がありましたが、
内容が若干違うように思いましたので、別スレッドを立てさせて頂きました。

環境:Linux Apache+Tomcat+JDK1.3
   IE6 SP1

Servletを使用して、サーバからクライアントへのファイルダウンロード処理を
実行しようと思っています。
ダウンロードダイアログボックスで、「開く」を選択すると、Word、Excelファイル
(AAA.doc、AAA.xls)は問題なく開けるのですが、テキストファイル(AAA.txt)だと、
ダイアログボックスが2度開き、2度目に「開く」を選択すると
「ファイル C:\\Document and Setting・・・\\Temporary InternetFiles\\Content.IE5\\xxxx\\AAA.txt[1]が見つかりません」
というエラーが表示されます。
一旦保存した後、ファイルを開くという処理を行うと問題なく開けます。

setContentTypeに"octet-stream"、"octet-stream-dummy"、"text/plain"を
設定してみたのですが、情況は変わりません。
これは、Servletの問題ではなく、どこかの設定が問題なのかとも
考えたのですが、どこの設定なのか見当がつきません。

下記にテスト用に作成したServletのソースを添付致します。
なにか見落としている点があればご指摘下さい。宜しくお願い致します。

Fname = "AAA.txt";
path = "/samplefile/SampleText.txt";
res.setContentType("text.plain");
res.setHeader("Content-Disposition", "attachment;filename=\\""+ Fname + "\\"");
res.setHeader("Content-Language","ja");
getServletContext().getRequestDispatcher(path).forward(req, res);
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-10-24 13:27
ニシトミです

確かファイルダウンロードにアクセスする
HTML側の設定で,form内のmethd=をgetとしないとだめだったような
気がします。
ここの会議室にもそんなスレッドがあったような
http://support.microsoft.com/default.aspx?scid=kb;ja;238588
↑が参考になるかもしれません

違ったらすみません
MNM
会議室デビュー日: 2003/10/24
投稿数: 4
投稿日時: 2003-10-24 14:42
返信ありがとうございます。

ニシトミ様のアドバイス通り、METHOD="get"に変更したところ、ダイアログボックスの2度空きは解消されました。しかし、依然として「開く」を選択するとエラーが発生してしまいます。
エラー:
「ファイル C:\\Document and Setting・・・\\Temporary InternetFiles\\Content.IE5\\xxxx\\AAA.txt[1]が見つかりません」

又、HTMLファイル(.html)のダウンロードもうまく作動しません。
こちらは、エラーはでないのですが、ファイルが開かないのです。
(ダウンロード中のダイアログは一瞬表示されるのですが・・・)

全てのファイルが同様に開かないのであれば、完全にプログラムを疑うのですが
.docや.xlsが順調に作動していますし、ファイル名や、ContentType(実際のプログラムではJAFのgetcontenttypeで取得しています)も正しく取れていることを確認済みです。

もうしばらくお知恵を拝借致したく、宜しくお願い致します。

ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-10-24 15:38
こんにちは

スレッドはここでした
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5606&forum=12

JAFのgetContentTypeを使ったことが無いので、わかりませんが
ちゃんと取れてるということなので疑いません...

引用:

MNMさんの書き込み (2003-10-24 13:18) より:
Fname = "AAA.txt";
path = "/samplefile/SampleText.txt";
res.setContentType("text.plain");
res.setHeader("Content-Disposition", "attachment;filename=\""+ Fname + "\"");
res.setHeader("Content-Language","ja");
getServletContext().getRequestDispatcher(path).forward(req, res);



別にMNMさんの方法を否定するつもりはありませんが
以下に
以前作ったサンプルコードを見ずらいですが編集して添付しておきます

//ファイルを取得する
File downloadFile = new File("hogehoge");
byte[] rBuf = new byte[(int)downloadFile.length()];
FileInputStream fis = null;
int fisSize = 0;
try {
fis = new FileInputStream(downloadFile);
//fisSize = fis.read(rBuf);
fisSize = fis.read(rBuf,0,(int)downloadFile.length());
} catch (IOException ie) {
throw ie;
}
//コンテントタイプをセットする
response.setContentType();
//ファイル名をセットする
response.addHeader("Content-Disposition", "attachment;filename="+"hogehoge" );
ServletOutputStream sos = null;
sos = response.getOutputStream();
try {
sos.write(rBuf,0,fisSize);
//sos.flush();
} catch (SocketException se) {
throw se;
} catch (Exception e) {
throw e;
} finally {
fis.close();
}
sos.close();

こんな感じです

また補足ですがFileのパス関連の、セパレータは
File.separatorで取得できます
こうしとくと、サーバの環境が変わった時にも対応できますね

[ メッセージ編集済み 編集者: ニシトミ 編集日時 2003-10-24 15:41 ]
MNM
会議室デビュー日: 2003/10/24
投稿数: 4
投稿日時: 2003-10-24 16:15
サンプルコード、じっくり見て(初心者なので・・・)使わせて頂きます。
ありがとうございます。

>別にMNMさんの方法を否定するつもりはありませんが

いえいえ、元はWebに公開されていたソースをマネしただけなので
逆に色々な方法を教えて頂いたほうが、うれしいです。
またご報告させて頂きますので、宜しくお願い致します。
1

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