サーブレットでファイルダウンロード(サンプルコード)。
doPost()または、doGet()内で
こんな感じ。(先日のIEでの問題を考慮すると、POSTがベター?
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename=\"hoge.txt\"");
PrintWriter out = res.getWriter();
out.println("hoge");←改行コードが処理系(サーバ側)依存になるけど。
しかし、Tomcat3.2.4+mod_jk(バージョン不明)+Apache1.3.28(まだ1.3.29にしてなかったの? というツッコミは不可(笑))の組み合わせでPOST(GETなら問題無し)すると、ApacheでInternal Server Errorが起きる...(Tomcatのポート直ならPOST/GET共に問題なし。
(11/14 21:00追記)
正確にはもう一つ
- doPost()メソッド内で、引数にて渡されるHttpServletRequestオブジェクトの、getParameter()を一度も呼んでいない場合。
という条件があるようです。
つまり、の1行をコメントアウトするだけで、Internal Server Errorが発生します(確認しました)。
String strWord = req.getParameter("Hoge");
ヘッダの指定は関係ないようで、以外にも例えば、
res.setHeader("Content-Disposition", "attachment;filename=\"hoge.txt\"");でも起きますし、無指定でも発生するようです。
res.setContentType("text/html; charset=Shift_JIS");
これがmod_jkに起因する問題かどうかは分かりませんが。
(まあ、mod_jkが介在しないと起きないので、mod_jkのせいのような気もしますが。ちなみに、mod_jk v1.2.5のビルドに失敗したので、バイナリで持ってきたmod_jk v1.2.4で確認しました。
しかし、これって仕様なんでしょうか...?
これってServlet界の常識なんでしょうか...?
まあ、いまだにTomcat3.2.4+mod_jkとか使ってるのが良くないのかも知れませんが。こんなの気付かねーぞ〜〜〜〜!!
(11/17追記)
あー、OSについて記述してませんでした。すみません。
OSは、Vine Linux2.1.5(RedHat6.2ベースらしい)です。
ちょっと古いのはSCOの訴訟対策です。(うそ
↑mod_jkのログにはこんなものが。あー、以前バイナリで持ってきた、mod_jkが古いのかな〜
[jk_ajp12_worker.c (503)]: ajpv12_handle_response, error reading header line
は〜、こんなとこでハマってる場合じゃないけど、mod_jkを新しくビルドしてみるかなあ。(じゃかるたのサイトにLinux版バイナリのmod_jkがないので。
しかし最近、よく細かい問題でハマってるような...
参考URL:
- http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html
- http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/http/HttpServletResponse.html
- http://support-j.novell.co.jp/extend/support/faq/designer.html
(11/14加筆修正)
JakartaのサイトにLinux版バイナリのmod_jkがないってのは、ウソでした。ありました。例えばこの辺です。
の、Tomcat Web Server Connectorsから辿るとなぜかないのですが...
ちなみに、ソースで持って来た
jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz
(解凍すると、jakarta-tomcat-connectors-jk-1.2.5-src)
の、ビルドは、今のところうまくいってません。(makeもantも途中で失敗する。