中文文件在不同的浏览器中编码方式不同:火狐是Base64编码, 其它浏览器(谷歌)是URL的utf-8编码
// 获得浏览器的类型
String agent = request.getHeader("User-Agent");
//判断浏览器的类型,然后进行编码
if(agent.contains("Firefox")){
// 火狐浏览器
filename = base64EncodeFileName(filename);
}else{
// IE,其他浏览器
filename = URLEncoder.encode(filename, "UTF-8");
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
//处理乱码方式1
filename=new String(filename.getBytes("ISO8859-1"),"UTF-8");
//方式2
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
其中agent就是请求头User-Agent的值