前段时间做项目时候,用到了struts2下载xml文件,实现的功能时将流程图从数据库导出到客户端(本地),但是文件名称使用的流程名称和时间戳来命名的,当文件名称是中文时候,通过浏览器下载到客户端有时候是乱码的情况,主要考虑了FireFox和IE浏览器。
解决思路是在前台通过javascript判断用户使用的是什么浏览器,通过变量记录下来,并拼接到url上,在后台判断浏览器的类型,通过不同的方式解决乱码问题。
上面的思路很好,也能解决问题,但是将项目打成war包发布到虚拟机中的tomcat中后,在虚拟机中的IE去下载xml文件,还会出现中午乱码问题。百思不得其解啊!!!!
我电脑是win7 64位,浏览器是IE9,而虚拟机中的系统是XP系统,浏览器是IE6并安装了IE8的插件,但是虚拟机中的火狐浏览器没有出现文件名中文时候乱码的情况。
现在通过查阅资料终于解决了虚拟机中IE中文名称乱码问题,下面是部分代码:
/** * * @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