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

本文介绍了一个Struts2项目中遇到的文件名中文乱码问题及其解决方案。通过对浏览器类型的判断,采取不同编码方式,成功解决了IE及虚拟机环境下中文文件名的乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接地址:[url]http://kevin12.iteye.com/blog/1947631[/url]

前段时间做项目时候,用到了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;

参考解决方法如下:[url]http://article.pchome.net/content-325592.html[/url]

链接地址:[url]http://kevin12.iteye.com/blog/1947631[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值