最近在做文档的下载,真可谓一波三折,浏览器兼容问题是最让人头疼的问题,包括中文乱码以及文件名中含有空格等。废话不多说立马贴code。。。。。。。
环境=> 服务器:linux(tomcat) 平台:Struts2+Spring+hibernate
String fname = ServletActionContext.getRequest().getParameter("name");
String userAgent = ServletActionContext.getRequest().getHeader("User-Agent"); //取得浏览器信息串进行分析
try{
/*
* 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
* 这里使用request.setCharacterEncoding解码无效.
* 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
*/
if (userAgent != null) {
userAgent = userAgent.toLowerCase();
// IE浏览器,只能采用URLEncoder编码
if (userAgent.indexOf("msie") != -1){
fname = new String(fname.getBytes("GBK"),"ISO8859-1");
System.err.println("IE............");
}else if (userAgent.indexOf("opera") != -1){
fname = URLEncoder.encode(fname,"UTF-8");
//编码后空格会变成”+“ 空格在UTF-8编码中为 %20
fname = StringUtils.replace(fname, "+", "%20");
System.err.println("opera............");
}else if (userAgent.indexOf("applewebkit") != -1 && userAgent.indexOf("chrome") != -1){// Chrome浏览器,只能采用 MimeUtility编码或ISO编码的中文输出
//mozilla/5.0 (windows nt 6.1) applewebkit/535.1 (khtml, like gecko) chrome/14.0.835.163 safari/535.1
fname = new String(fname.getBytes("GBK"),"ISO8859-1");
System.err.println("Chrome............");
}else if (userAgent.indexOf("safari") != -1 && userAgent.indexOf("chrome") == -1){
//mozilla/5.0 (windows nt 6.1) applewebkit/534.52.7 (khtml, like gecko) version/5.1.2 safari/534.52.7
fname = new String(fname.getBytes( "UTF-8" ), "ISO-8859-1" );
System.err.println("safari............");
}else if (userAgent.indexOf("mozilla") != -1){// FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出
String chinese = "[\u4e00-\u9fa5]";
Pattern pat = Pattern.compile(chinese);
Matcher matcher = pat.matcher(fname);
if (matcher.find())
//[判断文件名中是否含有中文 如果有就采用MimeUtility
else
//如果没有中文 就采用加密的方式 (该方法主要针对FF中文件名中有空格的问题)
System.err.println("FireFox............");
}
}
以上代码仅供参考,不一定放在什么地方都可用.在此之前俺也在网上浏览了大量code,但很多都不管用.如果大家还有其他的方式来实现,希望多多交流......