環境
- Internet Explorer 11 (11.125.16299.0)
- Microsoft Edge 41.16299.15.0
- Firefox 57
- Chrome 63
- Servlet 3.1
- Java8
- Tomcat9
- Windows10
やりたいこと
Java Servletでファイルのダウンロード
問題
以下のような、ファイルをダウンロードさせるコードを作成しました。
※HTTP Status Codeが200
でなく201
であることに注意
DownloadServlet.java
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setHeader("Content-Disposition", "attachment");
PrintWriter out = response.getWriter();
out.write("Hello World");
response.setStatus(201); //ステータスコードがCreated(OKではない)
}
}
各ブラウザで、localhost:8080/[ContextPath]/download
にアクセスしました。
Internet Explorer 11の場合
「このファイルをダウンロードできませんでした。」というメッセージが表示され、ダウンロードできませんでした。
MIcrosoft Edgeの場合
「ダウンロードを待っています」という状態のままで、ダウンロードはできませんでした。
Firefox, Chromeの場合
ダウンロードできました。
原因・解決策
HTTPステータスコードが201
(Created)であることが問題でした。
私のポカミスです。。。
ステータスコードを200
(OK)に変更したら、IE11/Edgeでもダウンロードできました。
response.setStatus(200);
感想
GETメソッドの成功を表すコードは200
なので、「ステータスコードが200でないからダウンロードできない」というIE11/Edgeの仕様は、特に問題ないと思います。
いつもなら「IEクソっ!」と思うところですが。。。