文件下载--Struts2的中文文件下载显示为空格问题
前言:最近公司项目中用到文件下载,根据底层,决定使用struts2的文件下载模式。乱码大多数都解决了,居然出现中文文件下载时,中文文字显示为空格的奇葩现象。在经过近三个小时的查询各种文档和苦思冥想,最终发现了问题。见网上还没有战友发出这个现象的文章,所以就写出来,分享给大家。
Struts2的配置文件中:
<!--数据文件下载 -->
<actionname="downloadTemplFile" class="fileDownloadAction">
<result name="success" type="stream">
<paramname="contentType">text/plain</param>
<paramname="contentType">application/octet-stream;charset=ISO8859-1</param>
<paramname="contentDisposition">attachment;fileName="${downloadFileName}"</param>
<paramname="inputName">inputStream</param>
<paramname="bufferSize">1024</param>
</result>
</action>
Java的使用方式:
publicString getDownloadFileName() {
String fileName1 =ServletActionContext.getRequest().getParameter("fileName");
try {
fileName1= new String(fileName1.getBytes("ISO8859-1"), "utf-8");
}catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String downFileName = fileName1;
try {
downFileName = newString(downFileName.getBytes(), "ISO8859-1");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("downFileName====================>"+downFileName);
return downFileName;
}
publicInputStream getInputStream() throws Exception{
String fileName1 =ServletActionContext.getRequest().getParameter("fileName");
Stringname = new String(fileName1.getBytes("ISO8859-1"),"utf-8");
System.out.println("name===========>"+name);
InputStreamin =ServletActionContext.getServletContext().getResourceAsStream("/custMonitorFile/"+name);
System.out.println(in);
returnin;
}
@Override
publicString execute() throws Exception {
return SUCCESS;
}
说明:
为什么Java源码中转两次?
回答:
//第一次 从jsp的get或者post获取的字段需要转码。
String fileName1 =ServletActionContext.getRequest().getParameter("fileName");
fileName1 = newString(fileName1.getBytes("ISO8859-1"), "utf-8");
//第二次 设置中文文件名要以“ISO8859-1”的格式发给客户端。
String downFileName = fileName1;
downFileName = newString(downFileName.getBytes(), "ISO8859-1");
注意:一定要弄清楚每次转码的目的,始发与终点。
如有好的建议,可留言或发至笔者邮箱:fzb_xx[email protected]