今天在做一个项目,使用了struts2实现了一个下载的功能。
当在页面点击下载之后,就报错了。
一开始我就怀疑是不是文件名中文的问题,于是乎,我把文件名改成了英文的。
Bingo!果然可以正常下载了。
那么说我的怀疑是正确的,然后开始想办法解决问题了。
先从我的下载的链接的传值那里开始入手,我的下载链接是这样的:
<a href="download.action?name=通信原理(第6版)-樊昌信.pdf" />">下载</a>
记得如果是URL传值的话,默认编码格式为:iso-8859-1
所以我在action接收这个“name”值时,用了一下的语句进行转码:
name = new String(name.getBytes("ISO-8859-1"), "UTF8");
然后再去重启项目,含有中文名的文件的下载也可以了。
但是,在下载的窗口还是不能显示中文名,只是能下载。
下载完后需要将名称及后缀名修改跟原来的一样才可以正常使用这个下载的文件。
然后我去网上查了一下资料,网上的方法是:在将“name”的值传递到页面的下载框中,需要将“name”值得编码再转回来:
name = new String(name.getBytes(), "ISO8859-1");
这次终于在下载框也可以正常显示中文名字了。
至此,关于下载功能的文件中文的问题成功解决了。
附上我的DownloadAction代码:
public class DownloadAction extends ActionSupport {
private String name;
public String getName() throws UnsupportedEncodingException {
name = new String(name.getBytes(), "ISO8859-1");
return name;
}
public void setName(String name) throws UnsupportedEncodingException {
name = new String(name.getBytes("ISO-8859-1"), "UTF8");
this.name = name;
}
public InputStream getDownloadFile() throws Exception {
InputStream in = ServletActionContext.getServletContext()
.getResourceAsStream("OnlineCourse//" + name);
return in;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
struts.xml配置文件部分配置:
<struts>
<action name="download" class="action.DownloadAction">
<result name="success" type="stream">
<param name="contentDisposition">attachment;filename="${name}"</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
说明:
<param name="contentDisposition">attachment;filename="${name}"</param>
这句话是设置在下载框显示的名字
${name}获取DownloadAction的name值
<param name="inputName">downloadFile</param>
此标签的值必须是DownloadAction里面的getDownloadFile方法名去掉get和将首字母小写的值