ファイル名に半角空白を含むファイルをダウンロードすると
ファイル名が化けるというバグに出くわしました。
例えば、
a b c.txt
というファイルをダウンロードしようとすると、
a+b+c.txt
となってしまいます。
原因
Servletでダウンロードさせるファイル名を指定するときには
次のようにするのが一般的です(IE, Chrome)。
HttpServletRequest req = ...; String headerValue = String.format("attachment; filename=%s", URLEncoder.encode(fileName)); req.addHeader("Content-Disposition", headerValue);
このとき、URLEncoder#encodeした結果であるheaderValueの値が
a+b+c.txt
となってしまっていることが原因です。
但しコレ、あながち間違いとも言えない。
なぜならURLエンコードの仕様上、半角空白を"+"で表すことが許されているからです。(MUSTかどうかは知らない...RFCに載っているはず)
解決方法
次のようにすればOK。
HttpServletRequest req = ...; String encodedFileName = URLEncoder.encode(originalFileName).replace("+", "%20"); req.addHeader( "Content-Disposition", "attachment; filename=" + encodedFileName);