- PR -

strutsでファイルをダウンロードする方法

1
投稿者投稿内容
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2003-11-11 13:41
いつもお世話になっています。
struts1.1で開発を行っているのですが
ファイル出力処理の書き方がわからず、困っています。

Actionクラスのexecuteメソッドで
DBにアクセスしデータを検索して、その結果を
CSVファイルに編集してファイルのダウンロードを行う、
という処理をしたいと思っています。
そこでファイルを出力するためにrequest.getOutputStream()を記述する
のですが、実行時に
"org.apache.jasper.JasperException:
getOutputStream()はこのレスポンスに対してすでに呼び出されています"
という例外が発生します。

strutsは内部的にOutputStreamを保持しているのでしょうか?
また、strutsでファイルを出力する処理のやり方について教えてください。
よろしくお願いします。
パルプ
ベテラン
会議室デビュー日: 2003/06/18
投稿数: 59
投稿日時: 2003-11-11 14:26
パルプです。

引用:

strutsは内部的にOutputStreamを保持しているのでしょうか?
また、strutsでファイルを出力する処理のやり方について教えてください。



strutsが内部的にOutputStreamを保持しているかは
その例外メッセージのとおりじゃないでしょうか。
ソース見てないのでハッキリとは言えないんですけど、
requestがresponseに対して渡している感じですかね〜?
(詳しい方、フォローお願いします!)

で、私は以下のようにしてやってます。

コード:

PrintWriter out = response.getWriter();
out.print("内容");
out.close();



ダウンロードさせるために、最後のreturnではnullを返すようにしてます。
ちょっと強引な気がするのですけど…(^^;

ご参考になれば幸いです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-11-11 16:51
引用:

umeさんの書き込み (2003-11-11 13:41) より:
そこでファイルを出力するためにrequest.getOutputStream()を記述する
のですが、実行時に
"org.apache.jasper.JasperException:
getOutputStream()はこのレスポンスに対してすでに呼び出されています"
という例外が発生します。



「request.getOutputStream()を記述」しているのはどこですか?
Actionクラスの中なら問題ないと思いますが。もしJSPのスクリプトレットの中でやっている
のであれば、Strutsとは関係なくエラーが出て当然です。
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2003-11-11 18:07
ご回答ありがとうございます。

まず、request.getOutputStream()の記述ですが、Actionクラスで記述しています。

パルプさんにご教授いただいた記述を行ってみたところ
ファイルの出力は成功しました。ありがとうございます。
ただ、日本語が文字化けしているのですが
これはどのように解消していらっしゃるのでしょうか?

わたしの記述は以下のとおりです。
----------
response.setContentType("application/x-download; charset=iso-2022-jp");
response.setHeader("Content-Disposition","attachment; filename=\"log.csv\"");
PrintWriter out = response.getWriter();
String str = "あああああ";
byte[] buf = str.getBytes("Windows-31J");
out.print(buf);
out.close();
----------
"Windows-31J"の部分は"Shift-JIS"も試してみました。

重ねてよろしくお願いします。



[ メッセージ編集済み 編集者: ume 編集日時 2003-11-11 18:11 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-11-11 19:48
引用:

umeさんの書き込み (2003-11-11 18:07) より:
ご回答ありがとうございます。

まず、request.getOutputStream()の記述ですが、Actionクラスで記述しています。



responseじゃなくてrequestのほうですか…
てっきりresponseだと思って見当違いの回答をしてしまいました。

引用:

ただ、日本語が文字化けしているのですが
これはどのように解消していらっしゃるのでしょうか?
----------
response.setContentType("application/x-download; charset=iso-2022-jp");
response.setHeader("Content-Disposition","attachment; filename="log.csv"");
PrintWriter out = response.getWriter();
String str = "あああああ";
byte[] buf = str.getBytes("Windows-31J");
out.print(buf);
out.close();
----------



content-typeのcharsetをiso-2022-jpにしているのはなぜですか?
文字化けってことは8bit目がマスクされてたりしませんか? 素直にエンコードしたのと
同じcharsetにすればいいのでは?
パルプ
ベテラン
会議室デビュー日: 2003/06/18
投稿数: 59
投稿日時: 2003-11-11 20:08
引用:

response.setContentType("application/x-download; charset=iso-2022-jp");
response.setHeader("Content-Disposition","attachment; filename="log.csv"");
PrintWriter out = response.getWriter();
String str = "あああああ";
byte[] buf = str.getBytes("Windows-31J");
out.print(buf);
out.close();



ukさんのご指摘のとおり、ContentTypeのcharsetの方の問題だと思います。
WindowsのExcelの表示ならば、Shift_JISで上手くいった気がします。
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2003-11-12 13:57
引用:

ukさんの書き込み (2003-11-11 19:48) より:
引用:

umeさんの書き込み (2003-11-11 18:07) より:
まず、request.getOutputStream()の記述ですが、Actionクラスで記述しています。



responseじゃなくてrequestのほうですか…
てっきりresponseだと思って見当違いの回答をしてしまいました。



すみません。requestは書き間違いでresponseの方でした。

文字化けについては
request.setCharacterEncoding()している文字コードとあわせて
request.setContentType()で指定すると
解消されました。getByte()での置換も必要ありませんでした。

お陰さまで解決しました。どうもありがとうございました。
1

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