动作类代码:
package com.itheima.web.action;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownLoadAction extends ActionSupport {
private InputStream inputStream;
private String fileName;
public String downLoad() throws FileNotFoundException, UnsupportedEncodingException{
String file = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload/1.jpg");//(此处假设服务器中有这个目录和文件)
inputStream = new FileInputStream(file);
fileName = "中文.jpg";
/*方式一:
fileName = URLEncoder.encode(fileName, "UTF-8");
方式二:
fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
方式三:在结果视图中设置参数contentDisposition时用ognl表达式${@java.net.URLEncoder@encode(fileName,"UTF-8")}
<param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(fileName,"UTF-8")}</param>
*/
return SUCCESS;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
struts2.xml中代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<package name="p1" extends="struts-default">
<action name="downLoad" class="com.itheima.web.action.DownLoadAction" method="downLoad">
<result name="success" type="stream">
<param name="inputstream">inputStream</param>
<param name="contentType">application/octet-stream</param>
<!-- <param name="contentDisposition">attachment;filename=${fileName}</param> -->
<param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(fileName,"UTF-8")}</param>
</result>
</action>
</package>
</struts>
struts2下载文件出现中文乱码问题可以用动作类中的两个方法,也可以在设置struts2.xml中action的结果视图result的参数contentDisposition时,在给filename赋值时使用
ongl表达式${@java.net.URLEncoder@encode(fileName,"UTF-8")},(注意:此处的fileName要与动作类的fileName属性的get方法保持一致,否则下载的文件名就是download.action)由于此处使用ognl表达式使用了静态方法,所以要在前面开启struts2的中ognl静态方法,即设置常量<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>相对于前两种方法第三种方法复杂一点点。