背景
在做文件下载的过程中,发现原来的做法是直接给response.getOutputStream()
中,写文件输入流的。并且在响应头中添加了content-disposition
响应头来告诉浏览器下载文件名。但是这里冒出中文乱码问题。
旧的做法
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
根据RFC 2616规定,HTTP 头必须是 ASCII 编码。这里使用UTF-8编码,浏览器只会使用ASCII 来解,然后就在前端乱码了。
新的做法
response.setHeader("content-disposition","attachment;filename*=UTF-8''" + URLEncoder.encode(fileName,"UTF-8"));
这里会主动告诉浏览器我使用的是UTF-8编码的文件名,这里主要使用了 标准来弄的。
content-disposition新协议
Content-Disposition: attachment; filename*=utf-8''%e2%82%ac%20rates
总结
抓住RFC协议,是我们Google解决问题的关键,尤其是要明白content-disposition
的作用,只要弄懂这个一切都好办了。
参考: