您的位置:首页 > 编程语言 > Java开发

Java下载文件,文件名中文乱码问题

2016-06-28 13:21 621 查看
在Java的web开发中,文件下载功能的文件名文件名乱码问题是经常遇到的。

对于这个问题,不同的浏览器,解决的方法不太一样。

IE的话,通过URLEncoder对filename进行UTF8编码。

而其他的浏览器(firefox、chrome、safari、opera),则要通过字节转换成ISO8859-1了。

示例代码(通过测试):

/**
* 下载文件名中含有中文的处理
* @param req
* @param headName
* @return
* @throws UnsupportedEncodingException
*/
public static String encodeFileName(HttpServletRequest req, String headName)
throws UnsupportedEncodingException {
String filename="";//IE9之前包括IE9都包含MSIE;IE10之后都包含Trident;edge浏览器包含Edge
String userAgent=req.getHeader("User-Agent");
if (userAgent.contains("MSIE") ||userAgent.contains("Trident")||userAgent.contains("Edge")) {
filename = URLEncoder.encode(headName, "UTF-8");
} else {
filename = new String(headName.getBytes("UTF-8"), "ISO8859-1");
}
return filename;
}
另外:IE6下注意中文文字不能超过超过17个。

所以更稳妥的方法是:
/**
* 下载文件名中含有中文的处理
* @param req
* @param headName
* @return
* @throws UnsupportedEncodingException
*/
public static String encodeFileName(HttpServletRequest req, String headName)
throws UnsupportedEncodingException {
String filename="";//IE9之前包括IE9都包含MSIE;IE10之后都包含Trident;edge浏览器包含Edge
String userAgent=req.getHeader("User-Agent");
if (userAgent.contains("MSIE") ||userAgent.contains("Trident")||userAgent.contains("Edge")) {

if(filename.length()>150){//解决IE 6.0 bug
filename=new String(headName.getBytes("UTF-8"),"ISO-8859-1");
}else{
filename = URLEncoder.encode(headName, "UTF-8");
}

} else {
filename = new String(headName.getBytes("UTF-8"), "ISO8859-1");
}
return filename;
}
不过由于IE6基本已经退出历史舞台,所以用第一种方法也基本上是没问题的。

附:获取浏览器user-agent的方法

参考文章:java文件下载文件名乱码

    java文件下载的文件名乱码问题的解决

java下载文件时文件名乱码问题解决办法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息