【問題解決】ファイルダウンロードのHTTPステータスコードが`201`だと、IE11/Edgeではダウンロードできない


環境

  • 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クソっ!」と思うところですが。。。

参考にしたサイト