- PR -

リダイレクトでエクセルファイルのバイナリの中身が表示されてしまう

投稿者投稿内容
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 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"/>
です。

エクセルとワード文書をブラウザに表示する方法を教えていただけませんでしょうか。
また、このやり方は一般的(?)でしょうか?もっと良いやり方があるのでしょうか?
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-02-17 16:26
そのときの URL はどんな感じのものになりますか?
http://host:port/a/b/xxx.xls
こんな感じですか?

おそらく MIME タイプが適切に設定されないため、ブラウザがうまく動作しない
んだと思いますが、リダイレクトの場合の MIME タイプ設定の方法が私もよく
わかりません。

私なら、Action から直接 response にExcelデータを流し込みます。
MIME タイプ設定できますし、ファイルを後で消す必要もないですし。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 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
に設定して(やり方はわかりませんが。。。)、そっちに制御を移す事って出来るの
でしょうか?
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-02-17 16:48
引用:

kojiさんの書き込み (2004-02-17 16:42) より:
APIリファレンスでHttpServletResponseを見てみましたが、
>Action から直接 response にExcelデータを流し込みます。
を出来るようなものが見つかりませんでした。


ServletResponse#getOutputStream()でストリームを取得できますよ。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 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();

もうちょっと探ってみます。
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-02-17 17:34
引用:

>http://host:port/a/b/xxx.xls
>こんな感じですか?
はい。このような感じです。



IEだったら拡張子で判断するかもと思ったのですが、やっぱりだめみたいですね。

引用:

>おそらく MIME タイプが適切に設定されないため、ブラウザがうまく動作しない
>んだと思いますが、リダイレクトの場合の MIME タイプ設定の方法が私もよく
>わかりません。
setContextType
を使って設定してみましたが、結果は同じでした。


リダイレクトじゃなければこれでいいんですけどね。

引用:

>私なら、Action から直接 response にExcelデータを流し込みます。
>MIME タイプ設定できますし、ファイルを後で消す必要もないですし。
その方法で出来ますか!その方法で出来たら言う事なしなんですが、やり方がさっぱ
りわかりません。すいませんが参考になるURL等ありましたら教えていただけませんか。



Servlet + ファイルダウンロードとかで検索するとごろごろ見つかるはず。

引用:

Actionは
return mapping.findForward("xxx");
のように最後にActionForwardを返さないといけないですよね?その途中でresponse
に設定して(やり方はわかりませんが。。。)、そっちに制御を移す事って出来るの
でしょうか?



いいえ、response のストリームにファイルデータを流し込んで、Action#execute は
null を返すのが定石です。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 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をマッピング設定しました。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2004-02-17 17:39
ふーばーさん、ありがとうございます。
入れ違いで投稿してしまいました。

>いいえ、response のストリームにファイルデータを流し込んで、Action#execute は
>null を返すのが定石です

なるほど、そのように出来るのですね。そのように実装してみます。
Servlet + ファイルダウンロード で調べてみます。

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