- - PR -
リダイレクトでエクセルファイルのバイナリの中身が表示されてしまう
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-17 13:33
こんにちは。
現在、 Red Hat Linux9 JBoss3.2.3(Tomcatバンドル版) Struts1.1 PostgreSQL7.4.1 にてWebアプリケーションを作成しています。 ブラウザにエクセル文書を表示したいのですが、中身が表示されてしまいます。 JSPの内容は以下のようになっています。 <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <bean:define id="docurl"> <bean:write name="urlinfo" property="url"/> </bean:define> <% response.sendRedirect(docurl); %> このJSPファイルが表示される前に実行されるActionにてPostgreSQLよりファイルを 取得し、サーバ上に保存します。そのURLが <bean:write name="urlinfo" property="url"/> です。 エクセルとワード文書をブラウザに表示する方法を教えていただけませんでしょうか。 また、このやり方は一般的(?)でしょうか?もっと良いやり方があるのでしょうか? | ||||||||||||||||
|
投稿日時: 2004-02-17 16:26
そのときの URL はどんな感じのものになりますか?
http://host:port/a/b/xxx.xls こんな感じですか? おそらく MIME タイプが適切に設定されないため、ブラウザがうまく動作しない んだと思いますが、リダイレクトの場合の MIME タイプ設定の方法が私もよく わかりません。 私なら、Action から直接 response にExcelデータを流し込みます。 MIME タイプ設定できますし、ファイルを後で消す必要もないですし。 | ||||||||||||||||
|
投稿日時: 2004-02-17 16:42
ふーばーさん、いつもありがとうございます。
>http://host:port/a/b/xxx.xls >こんな感じですか? はい。このような感じです。 >おそらく MIME タイプが適切に設定されないため、ブラウザがうまく動作しない >んだと思いますが、リダイレクトの場合の MIME タイプ設定の方法が私もよく >わかりません。 setContextType を使って設定してみましたが、結果は同じでした。 >私なら、Action から直接 response にExcelデータを流し込みます。 >MIME タイプ設定できますし、ファイルを後で消す必要もないですし。 その方法で出来ますか!その方法で出来たら言う事なしなんですが、やり方がさっぱ りわかりません。すいませんが参考になるURL等ありましたら教えていただけませんか。 APIリファレンスでHttpServletResponseを見てみましたが、 >Action から直接 response にExcelデータを流し込みます。 を出来るようなものが見つかりませんでした。 Actionは return mapping.findForward("xxx"); のように最後にActionForwardを返さないといけないですよね?その途中でresponse に設定して(やり方はわかりませんが。。。)、そっちに制御を移す事って出来るの でしょうか? | ||||||||||||||||
|
投稿日時: 2004-02-17 16:48
ServletResponse#getOutputStream()でストリームを取得できますよ。 | ||||||||||||||||
|
投稿日時: 2004-02-17 17:33
でゅうくさん、ありがとうございます。
getOutputStream()を使用してやってみました。実際、エクセルファイル を開く事が出来ました。しかし、以下の問題が発生しました。 ・ダウンロード確認ダイアログが表示されてしまう。開くを押すと表示される。 ・エラーが発生している。 以下がエラーです。 17:19:12,421 ERROR [Engine] ApplicationDispatcher[/dms] サーブレット jsp のServl et.service()が例外を投げました org.apache.jasper.JasperException: getOutputStream()はこのレスポンスに対して既に 呼び出されています at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper .java:254) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:2 95) エラーがたくさん続く。。。。 getOutputStreamが何回か(2回)呼ばれているような感じのエラーでしょうか? Strutsの方で読んでいたりするのでしょうか?Actionのソースは以下のようになり ます。 //Actionのexecuteメソッドのソースの一部 //DBから拡張子と文書ファイルデータ(wordかexcel)を取得 rs.next(); byte[] imgBytes = rs.getBytes("doc"); String filetype = rs.getString("filetype"); //ワードの場合 if (filetype.equals("doc")) { response.setContentType("application/msword"); } //エクセルの場合 else if (filetype.equals("xls")) { response.setContentType("application/vnd.ms-excel"); } //ストリームを取得しデータを流し込みクローズする ServletOutputStream out = response.getOutputStream(); out.write(imgBytes); out.close(); もうちょっと探ってみます。 | ||||||||||||||||
|
投稿日時: 2004-02-17 17:34
IEだったら拡張子で判断するかもと思ったのですが、やっぱりだめみたいですね。
リダイレクトじゃなければこれでいいんですけどね。
Servlet + ファイルダウンロードとかで検索するとごろごろ見つかるはず。
いいえ、response のストリームにファイルデータを流し込んで、Action#execute は null を返すのが定石です。 | ||||||||||||||||
|
投稿日時: 2004-02-17 17:36
Actionでは次のアクションを返さないといけないと思うので、最後を
return mapping.findForward("success"); のようにし、struts-configには <action path="/Documentref_doc" type="dms.DmsDocumentref_docAction" name="DmsDocumentref_docForm" scope="request" validate="false"> <forward name="success" path="/pages/reference_doc.jsp"/> </action> のようにとりあえずダミーのjspをマッピング設定しました。 | ||||||||||||||||
|
投稿日時: 2004-02-17 17:39
ふーばーさん、ありがとうございます。
入れ違いで投稿してしまいました。 >いいえ、response のストリームにファイルデータを流し込んで、Action#execute は >null を返すのが定石です なるほど、そのように出来るのですね。そのように実装してみます。 Servlet + ファイルダウンロード で調べてみます。 | ||||||||||||||||
