链接地址:http://kevin12.iteye.com/blog/1947631
前段时间做项目时候,用到了
struts2下载xml文件,实现的功能时将流程图从数据库导出到客户端(本地),但是
文件名称使用的流程名称和时间戳来命名的,当文件名称是中文时候,通过浏览器下载到客户端有时候是乱码的情况,主要考虑了
FireFox和
IE浏览器。
解决思路是在前台通过
javascript判断用户使用的是什么浏览器,通过变量记录下来,并拼接到url上,在后台判断浏览器的类型,通过不同的方式解决
乱码问题。
上面的思路很好,也能解决问题,但是将项目打成war包发布到虚拟机中的tomcat中后,在虚拟机中的IE去下载xml文件,还会出现中午乱码问题。百思不得其解啊!!!!
我电脑是win7 64位,浏览器是IE9,而虚拟机中的系统是XP系统,浏览器是
IE6并安装了IE8的插件,但是虚拟机中的火狐浏览器没有出现文件名中文时候乱码的情况。
现在通过查阅资料终于解决了虚拟机中IE中文名称乱码问题,下面是部分代码:
class="java">
/**
*
* @Description: 将流程信息导出为xml文件
* @Auther: lujinyong
* @Date: 2013-9-10上午09:55:34
*/
public String exportWorkflowXml(){
WebWorkflowMainService workflowMainService = (WebWorkflowMainService) getServiceBean("webWorkflowMainService");
WebWorkflowNodeService workFlowNodeService = (WebWorkflowNodeService) getServiceBean("webWorkflowNodeService");
try {
TbBWebWorkflOwMain main = workflowMainService.findByWorkFlowId(returnFlowId);
List<TbBWebWorkflOwNode> nodes = workFlowNodeService.findByWorkFlowId(main.getWwmWorkflowId());
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
String time = String.valueOf(calendar.get(Calendar.YEAR))
+String.valueOf(calendar.get(Calendar.MONTH)+1)
+String.valueOf(calendar.get(Calendar.DAY_OF_MONTH))
+String.valueOf(calendar.get(Calendar.HOUR_OF_DAY))
+String.valueOf(calendar.get(Calendar.MINUTE))
+String.valueOf(calendar.get(Calendar.SECOND));
//解决文件名中文乱码问题
/*火狐没问题,ie出现了问题
fileName = new String((main.getWwmWorkflowName()+"_"+time+".xml").getBytes("UTF-8"), "ISO8859-1");
*/
/*ie没问题,火狐出现问题
*/
// fileName = new String((main.getWwmWorkflowName()+"_"+time+".xml").getBytes(), "UTF-8");
// fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); // 这句很重要,不然文件名为乱码
//通过javascript获取浏览器的类型,用url传过来进行判断解决中文乱码
if("Firefox".equalsIgnoreCase(explorerType)){
fileName = new String((main.getWwmWorkflowName()+"_"+time+".xml").getBytes("UTF-8"), "ISO8859-1");
}else{
// fileName = new String((main.getWwmWorkflowName()+"_"+time+".xml").getBytes(), "UTF-8");
// fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
// fileName=fileName.replace("+", "%20");
//解决在虚拟机(系统是XP)IE导出下载文件中文名称乱码的问题
fileName = new String((main.getWwmWorkflowName()+"_"+time+".xml"));
getHttpResponse().setCharacterEncoding("UTF-8");
fileName=java.net.URLEncoder.encode(fileName,"UTF-8");
getHttpResponse().setHeader("Content-Disposition", "attachment; filename=" +new String(fileName.getBytes("UTF-8"),"GBK"));
}
Document document = NodeXmlFactory.sql2Xml(main,nodes);
/**将document保存到xml中,保存到客户端 */
xmlStream = new ByteArrayInputStream(document.asXML().getBytes());
xmlStream.close();
/**下面注释的代码可将document写到xml中并保存到服务器*/
// FileOutputStream xmlOut = new FileOutputStream(new File("mysql_back.xml"));
// XMLWriter xmlWriter = new XMLWriter(xmlOut,OutputFormat.createPrettyPrint());
// xmlWriter.write(document);
// xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return "success";
}
上面注释都很详细了,这里就不多说明。下面前台访问action的代码也贴出来如下:
//获取浏览器的类型
var explorerType = "";
if(navigator.userAgent.indexOf("MSIE")>0){
explorerType="IE";
}
if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
explorerType="Firefox";
}
location.href = 'exportWorkflowXml.action?returnFlowId='+record.wwmWorkflowId+'&explorerType='+explorerType;
参考
解决方法如下:http://article.pchome.net/content-325592.html
链接地址:http://kevin12.iteye.com/blog/1947631