以下内容为转载,再加上自己的一些解决方法,如有冒犯,请见谅。新手上路,大家多多指教~~
原链接:内容出处链接
经过本人实验该方法非常简单:
Struts2文件下载时,如果所下载的文件名是中文时,就会出现乱码。
解决办法如下:
步奏一:修改fileName属性的set方法
public void setFileName(String fileName)
throws UnsupportedEncodingException {
this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
}
步骤二:在getInputStream()方法中加上下面一句
(我的补充:加上下面的代码,在MyEclipse自带的浏览器会正常显示,在chorm中会出现
收到了来自服务器的重复标头
ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION
问题,后面说到解决方法
)
ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="+java.net.URLEncoder.encode(fileName, "UTF-8"));
http://www.cnblogs.com/gywbg --------------GYW
以下是我的补充:
jsp:
<a href="hello?filename=1501560005_Java程序设计_教学进度表.doc" >dowmloading</a>
</body>
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="hello" class="com.szu.action.DownloadAction">
<!-- 向action传递参数,指定路径 -->
<param name="downloadFile">/image/</param>
<result name="success" type="stream">
<!-- 输入流名称,对应action类中的gettargetfile()方法 -->
<param name="inputName" >targetFile</param>
<!-- 设置下载名称,attachment :下载时会打开下载框 -->
<param name="contentDisposition">
filename=${filename};
</param>
<!-- 下载文件时缓冲区的大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
DownloadAction.java:
package com.szu.action;
import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.jasper.xmlparser.UTF8Reader;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport{
private String filename;
private String downloadFile;
public String getFilename() {//用这段代替原作者第二步骤的代码,即可解决chorm的兼容性
System.out.println("gettname===="+filename);
try {
filename=java.net.URLEncoder.encode(filename, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("gettname===="+filename);
return filename;
}
public void setFilename(String filename) {
System.out.println("setname===="+filename);
try {
filename=new String(filename.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("setname===="+filename);
this.filename = filename;
}
public String getDownloadFile() {
return downloadFile;
}
//需要下载的文件路径
public void setDownloadFile(String downloadFile) { //路径由配置文件中传递过来
this.downloadFile = downloadFile;
}
public InputStream getTargetFile() { //由上面的路径,生成它的输入流
System.out.println("path="+downloadFile);
File file=new File(downloadFile);
downloadFile+=filename;
InputStream in=ServletActionContext.getServletContext().getResourceAsStream(downloadFile);
return in;
}
public String execute() throws Exception{
return SUCCESS;
}
}
控制台效果:(控制台出现乱码,在浏览器没出现乱码)
setname====1501560005_Java程åºè®¾è®¡_æ•™å¦è¿›åº¦è¡¨.doc
setname====1501560005_Java程序设计_教学进度表.doc
path=/image/
gettname====1501560005_Java程序设计_教学进度表.doc
gettname====1501560005_Java%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1_%E6%95%99%E5%AD%A6%E8%BF%9B%E5%BA%A6%E8%A1%A8.doc
setname====1501560005_Java程序设计_教学进度表.doc
path=/image/
gettname====1501560005_Java程序设计_教学进度表.doc
gettname====1501560005_Java%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1_%E6%95%99%E5%AD%A6%E8%BF%9B%E5%BA%A6%E8%A1%A8.doc