struts2文件下载的原理是 页面请求,经过一struts的动态代理,拦截器等,在Action中获得文件的流,在经由struts.xml中的result配置,获得流将流传递给 tomcat,从而使用户获得下载的文件(说错的,或者说的不完整的,请大神指正,目前小弟就理解到这个水平了);
首先是Action代码
文件是 ImageDownloadAction
package cn.itcast.action.f_download;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ImageDownloadAction extends ActionSupport {
//1 下载的资源
private InputStream targetName;
//2下载的文件名称
private String fileName;
@Override
public String execute() throws Exception {
//this.fileName = "美女.jpg";
//准备下载的资源流
//ServletActionContext.getServletContext().getRealPath("/e_download/1.jpg"); //获得文件路径
this.targetName = ServletActionContext.getServletContext().getResourceAsStream("/f_download/" + fileName); //文件对应的流
return SUCCESS;
}
public InputStream getTargetName(){
return this.targetName;
}
/**
* <result type="stream" 获得文件名称
* @return
* @throws UnsupportedEncodingException
*/
public String getFileName() throws UnsupportedEncodingException {
// * 注意:<s:debug /> 会出现空指针,需要非空验证
if(fileName != null){
return new String(fileName.getBytes("GBK"),"ISO-8859-1");
}
return null;
}
/**
* 获得get请求 资源名称
* @param fileName
* @throws UnsupportedEncodingException
*/
public void setFileName(String fileName) throws UnsupportedEncodingException {
fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8"); //如果文件名称是从链接中传递过来的,这样赋值,避免中文乱码
this.fileName = fileName;
}
}
接下来配置structs.xml 文件
<!-- f_download 中文文件下载 -->
<action name="imageDownloadAction2" class="cn.itcast.action.f_download.ImageDownloadAction">
<result name="success" type="stream">
<!-- e1 配置 获得流 action属性名称,action必须提供getter -->
<!-- 这两个配置可以参照struts源代码 -->
<param name="inputName">targetName</param>
<!-- e2确定资源流必须下载 -->
<!--${fileName}是从imageDownloadAction2中的getFileName中获得的 -->
<param name="contentDisposition">attachment;filename=${fileName}</param> //否则直接显示在浏览器上
</result>
</action>