- PR -

ファイルダウンロード時に"ドキュメントにデータがありません"が表示

1
投稿者投稿内容
ひび
会議室デビュー日: 2003/09/04
投稿数: 3
投稿日時: 2003-09-04 16:20
こんにちは。いつもお世話になっています。
ひびといいます。

現在、Webサーバよりcsvファイルを転送させようとプログラムを作っていますが、ファイル容量の大きい(50M)ものを転送しようとするとブラウザより"ドキュメントにデータがない"とエラーが返ってきます。

@数Mbyteのものは問題なく動作する。
A転送するファイルに加工処理を行なっているために、時間がかかりprintlnで出力しようとする処理の前でファイル保存ダイアログが表示される。よってファイルができておらずMSGがで
てしまうように見える。
Bブラウザ Netscape4.73

ソース(概要)
// contentTypeを出力
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment;   filename="fileName1+".csv");
 PrintWrier pr = response.getWriter();

以下で送信するファイルを作成。
 (処理は省略)
 最終的にtxt(stringに格納)
pr.println(txt);
pr.close();
質問ですが、ファイル保存ダイアログはどのタイミングで起動するのですか?
ファイルが大きいとprintln()の前で既にダイアログが起動しています。
初心者なので分からないのですが、javaの標準関数(setHeaderとかgetwriter)の中でブラウザに通知したりするんですか?教えてください。お願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-04 23:21
ひびさんこんにちは。

ダイヤログはサーバの出力によってではなく、ブラウザ側で表示しています。
ダイヤログで保存先を決めて、「OK」ボタンを押してから GETしていると
思います。

幾つかのブラウザでは、「OK」ボタンが押される前に平行してダウンロード
しています。(たしか、Netscape 4.xはそうだったような。)

また、幾つかのブラウザではダイヤログを出す前に URIの存在をチェックして
いるものもあります。(HEADを使っているのか、GETの応答の一部を受け取って
るのかはわかりませんが。)

「ドキュメントにデータがない」と表示されるのは、サーブレットの実行中に
例外が発生しているからと思われます。ログを確認してみるのも良いでしょう。

あと、問題と直接関係無いかもしれませんが,50MBものコンテンツを文字列に
いれて、それを PrintWriter経由で送信するのはかなり heavyに感じます。
もし、コンテンツがファイルなら、バイナリのまま ServletOutputStreamを
使って少しずつ(例えば 1MBずつ)送信したほうが良いように思います。
実際、私はそうやって 300MBものファイルを問題無く Netscape 4.78, 7.1
IE 6.0等に送っています。

コンパイルは出来ていると思いますから、転記誤りと思いますが,
filename="fileName1+".csv" のところに + が1個たりません。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-09-05 09:18
引用:

ダイヤログはサーバの出力によってではなく、ブラウザ側で表示しています。
ダイヤログで保存先を決めて、「OK」ボタンを押してから GETしていると
思います。



いや、おそらくGETリクエストはその前に送られていてヘッダだけ受け取った段階で
ダイアログが表示されているのではないでしょうか。でないとコンテントタイプも
不明ですし、ダウンロードの対象である事はわからないでしょう。

引用:

「ドキュメントにデータがない」と表示されるのは、サーブレットの実行中に
例外が発生しているからと思われます。ログを確認してみるのも良いでしょう。



これは私もそう思います。後は処理に時間がかかっていてタイムアウトを起こして
いる可能性もあるのではないでしょうか。それを防ぐ意味でも、

引用:

あと、問題と直接関係無いかもしれませんが,50MBものコンテンツを文字列に
いれて、それを PrintWriter経由で送信するのはかなり heavyに感じます。
もし、コンテンツがファイルなら、バイナリのまま ServletOutputStreamを
使って少しずつ(例えば 1MBずつ)送信したほうが良いように思います。
実際、私はそうやって 300MBものファイルを問題無く Netscape 4.78, 7.1
IE 6.0等に送っています。



このような処理は必要ですね。
ひび
会議室デビュー日: 2003/09/04
投稿数: 3
投稿日時: 2003-09-05 11:04
Kissinger様、uk様ご返答ありがとうございます。
ご意見いろいろと参考になりました。
PrintWriter経由で一度に送信する処理も、よく考えてみたらあまりよくない処理ということも
分かりましたので、そこら辺りの処理も含めて作りを変えてみようと思います。
ありがとうございました!
1

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