java下载文件名乱码解决方法介绍
内容摘要
java Web开发下载文件功能(代码如下),文件名如果带有中文,经常会出现乱码现象,需要进行编码。(推荐:java视频教程)String fileName = "测试文件.doc";
try {
HttpServletRespon
try {
HttpServletRespon
文章正文
java Web开发下载文件功能(代码如下),文件名如果带有中文,经常会出现乱码现象,需要进行编码。(推荐:java视频教程)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | String fileName = "测试文件.doc" ; try { HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader( "Content-disposition" , "attachment; filename=" + fileName); response.setContentLength((int) file.length()); response.setContentType( "application/octet-stream;charset=UTF-8" ); byte[] b = new byte[1024]; int i = 0; FileInputStream fis = new FileInputStream(file); ServletOutputStream out = response.getOutputStream(); while ((i = fis.read(b)) > 0) { out.write(b, 0, i); } out.flush(); out.close; fis.close(); } catch (IOException e) { e.printStackTrace(); } FacesContext.getCurrentInstance().responseComplete(); return null ; |
方案一:将文件名编码为Unicode
1 | fileName = URLEncoder.encode(fileName, "UTF-8" ); |
文件名会转换为Unicode编码(%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.doc),在IE浏览器下测试正常,但是Firefox浏览器下测试得到的文件名是没有解码的Unicode。
方案二:将文件名编码为ISO-8859-1
1 | fileName = new String(fileName.getBytes( "UTF-8" ), "ISO-8859-1" ); |
这种方式在IE下和Firefox下均可以得到中文文件名的文件。但如果文件名中带有空格,Firefox会从空格处截断文件名,需要在编码之前将文件名中的空格替换成下划线之类的可见字符。
1 | fileName = new String(fileName.replace( " " , "_" ).getBytes( "UTF-8" ), "ISO-8859-1" ); |
方案三:浏览器不兼容
在Java的web开发中,文件下载功能的文件名文件名乱码问题是经常遇到的。
对于这个问题,不同的浏览器,解决的方法不太一样。
IE的话,通过URLEncoder对filename进行UTF8编码。
而其他的浏览器(firefox、chrome、safari、opera),则要通过字节转换成ISO8859-1了。
1 2 3 4 5 | if (request.getHeader( "User-Agent" ).toUpperCase().indexOf( "MSIE" ) > 0) { filename = URLEncoder.encode(filename, "UTF-8" ); } else { filename = new String(filename.getBytes( "UTF-8" ), "ISO8859-1" ); } |
更多java知识请关注java基础教程栏目。
代码注释
[!--zhushi--]