ファイルのダウロード処理を行う際に使用する「getoutputstream()」。
この「getoutputstream()」ですが、なぜかコンソール上にエラーが発生してしまうことがありました。
エラーの内容は、「このレスポンスに対して既に呼び出されています」です。
エラーがコンソール上に出てはいるものの、ファイルはダウンロードされるので特に問題はなさそうですが、エラーが出力されるのはやはり気に食わない。
ということで色々調べてみたものの、どれもうまくいきませんでした。
そこで色々試してみた結果解決できたので、その方法をご紹介しておきます。
getoutputstreamのエラーについて
先ほども触れましたが、「getoutputstream()」を使用してエラーが出た際の内容は、
「このレスポンスに対して既に呼び出されています」
です。
エラーの内容からして、何かのclose漏れか何かかと思いましたが、僕のソースコードは間違いなくclose処理を書いています。
ですので、それ以外の何かでエラーが出力されてしまっているということになります。
以下が僕が書いたソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<!-- ============================================================ --> <!-- サンプル --> <!-- --> <!-- 改訂履歴 --> <!-- 2018/07/26 [0.0.1] K.Izumi Create --> <!-- --> <!-- @version 0.0.1 --> <!-- @auther K.Izumi Create --> <!-- ============================================================ --> <%@ page language="java" %><%@ page pageEncoding="UTF-8" %><%@ page contentType="text/html; charset=UTF-8" %><% /*------------------------------------------* * Import *------------------------------------------*/ %><%@ page import="java.util.*" %><% Calendar cal = Calendar.getInstance(); cal.set(1970, 0, 1, 0, 0, 0); response.setDateHeader("Last-Modified", Calendar.getInstance().getTimeInMillis()); response.setDateHeader("Expires", cal.getTimeInMillis()); response.setHeader("pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); ServletOutputStream out_ = response.getOutputStream(); try { response.setContentType("application/pdf"); out_.flush(); } finally { out_.close(); } %> |
エラーの原因は?
エラーの原因は「これ!」というものがありません。
が、以下の記述がある場合は疑ってみると良いでしょう。
・余計な改行
・余計なコメント
エラーの解決方法!
先ほどのソースコードは何が問題だったかと言うと、これです。
1 2 3 4 5 6 7 8 9 |
<!-- ============================================================ --> <!-- サンプル --> <!-- --> <!-- 改訂履歴 --> <!-- 2018/07/26 [0.0.1] K.Izumi Create --> <!-- --> <!-- @version 0.0.1 --> <!-- @auther K.Izumi Create --> <!-- ============================================================ --> |
先頭行に記載しているファイルのコメントが邪魔していました。
他の解決方法でスクリプトレットや改行が怪しいという記述を見て、もしやと思いコメントを消したらエラーが出力されなくなりました。
「このレスポンスに対して既に呼び出されています」って関係ないやん。。
まとめ
「getoutputstream」に関するエラーは非常に分かりにくいです。
エラーの内容とは関係なく、改行やコメントが悪さをしていることが多いので解決するのも一苦労です。
エラーがどうしても出力されてしまう場合は、コメントなどをガンガン削除して、ひたすらデバックするなりした方が早いような気がします。
ではまた!