- - PR -
strutsでファイルをダウンロードする方法
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-11 13:41
いつもお世話になっています。
struts1.1で開発を行っているのですが ファイル出力処理の書き方がわからず、困っています。 Actionクラスのexecuteメソッドで DBにアクセスしデータを検索して、その結果を CSVファイルに編集してファイルのダウンロードを行う、 という処理をしたいと思っています。 そこでファイルを出力するためにrequest.getOutputStream()を記述する のですが、実行時に "org.apache.jasper.JasperException: getOutputStream()はこのレスポンスに対してすでに呼び出されています" という例外が発生します。 strutsは内部的にOutputStreamを保持しているのでしょうか? また、strutsでファイルを出力する処理のやり方について教えてください。 よろしくお願いします。 | ||||||||
|
投稿日時: 2003-11-11 14:26
パルプです。
strutsが内部的にOutputStreamを保持しているかは その例外メッセージのとおりじゃないでしょうか。 ソース見てないのでハッキリとは言えないんですけど、 requestがresponseに対して渡している感じですかね〜? (詳しい方、フォローお願いします!) で、私は以下のようにしてやってます。
ダウンロードさせるために、最後のreturnではnullを返すようにしてます。 ちょっと強引な気がするのですけど…(^^; ご参考になれば幸いです。 | ||||||||
|
投稿日時: 2003-11-11 16:51
「request.getOutputStream()を記述」しているのはどこですか? Actionクラスの中なら問題ないと思いますが。もしJSPのスクリプトレットの中でやっている のであれば、Strutsとは関係なくエラーが出て当然です。 | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2003-11-11 19:48
responseじゃなくてrequestのほうですか… てっきりresponseだと思って見当違いの回答をしてしまいました。
content-typeのcharsetをiso-2022-jpにしているのはなぜですか? 文字化けってことは8bit目がマスクされてたりしませんか? 素直にエンコードしたのと 同じcharsetにすればいいのでは? | ||||||||
|
投稿日時: 2003-11-11 20:08
ukさんのご指摘のとおり、ContentTypeのcharsetの方の問題だと思います。 WindowsのExcelの表示ならば、Shift_JISで上手くいった気がします。 | ||||||||
|
投稿日時: 2003-11-12 13:57
すみません。requestは書き間違いでresponseの方でした。 文字化けについては request.setCharacterEncoding()している文字コードとあわせて request.setContentType()で指定すると 解消されました。getByte()での置換も必要ありませんでした。 お陰さまで解決しました。どうもありがとうございました。 | ||||||||
1
