struts2文件下载文件中文名称乱码解决_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > struts2文件下载文件中文名称乱码解决

struts2文件下载文件中文名称乱码解决

 2013/9/26 15:50:19  Kevin12  程序员俱乐部  我要评论(0)
  • 摘要:链接地址:http://kevin12.iteye.com/blog/1947631前段时间做项目时候,用到了struts2下载xml文件,实现的功能时将流程图从数据库导出到客户端(本地),但是文件名称使用的流程名称和时间戳来命名的,当文件名称是中文时候,通过浏览器下载到客户端有时候是乱码的情况,主要考虑了FireFox和IE浏览器。解决思路是在前台通过javascript判断用户使用的是什么浏览器,通过变量记录下来,并拼接到url上,在后台判断浏览器的类型,通过不同的方式解决乱码问题
  • 标签:解决 文件 下载 文名称乱码解决 struts
链接地址:http://kevin12.iteye.com/blog/1947631
   
前段时间做项目时候,用到了struts2下载xml文件,实现的功能时将流程图从数据库导出到客户端(本地),但是文件名称使用的流程名称和时间戳来命名的,当文件名称是中文时候,通过浏览器下载到客户端有时候是乱码的情况,主要考虑了FireFoxIE浏览器

    解决思路是在前台通过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
发表评论
用户名: 匿名