Java|使用Content-Disposition: attachment; filename=FILENAME,在Firefox浏览器中下载文件,文件名中文乱码问题解决。
FILENAME为我们要下载的文件的文件名(包含后缀),RFC 2183规定FILENAME只能为US-ASCII码,然而现代浏览器中许多已经支持UTF-8编码了,但各个浏览器的支持规则不同。在IE、chrome中,可以直接用FILENAME作为下载文件的名称,但是Firefox却不支持这样。我们直接上代码吧。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//获取文件路径并创建一个出入流
String path = this.getServletContext().getRealPath("/WEB-INF/classes/囧雪.jpg");
FileInputStream fis = new FileInputStream(path);
//创建输出流,向客户端输出数据
ServletOutputStream sos = response.getOutputStream();
//获取文件名
String fileName = path.substring(path.lastIndexOf('\\') + 1);
//文件名转码
fileName = URLEncoder.encode(fileName, "UTF-8");
//告诉客户端以什么解码方式打开文件
//response.setContentType("UTF-8");
//告诉客户端下载文件
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > -1)
{
response.setHeader("Content-Disposition", "attachment;
filename*=UTF-8''" + fileName);
System.out.println("firefox");
} else {
response.setHeader("content-disposition", "attachment;
filename=" + fileName);
}
//response.setHeader("content-disposition", "attachment;
filename=" + fileName);
response.setHeader("content-type", "img/jpeg");
//输出
byte[] buf = new byte[1024];
int len = -1;
while((len = fis.read(buf)) != -1) {
sos.write(buf, 0, len);
}//关流
sos.close();
fis.close();
}
response.setHeader("Content-Disposition", "attachment;
filename*=UTF-8''" + fileName);
这一句代码即可解决火狐浏览器中下载文件的中文乱码问题。真奇怪,以为UTF-8后直接加个空的单引号对,但它确实是这么用的。
【Java|使用Content-Disposition: attachment; filename=FILENAME,在Firefox浏览器中下载文件,文件名中文乱码问题解决。】完。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- iOS中的Block