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浏览器中下载文件,文件名中文乱码问题解决。】完。


    推荐阅读