这里说的文件下载指的是通过Java代码返回文件流给客户端,而不是直接链接一个具体的文件URL。 原理:Action中定义一个读取文件流的方法,返回值为InputStream,声明Action时,result类型为stream,参数指定读取文件流的方法以及返回给客户端的文件名。 下面的例子是让用户自己提交文件路径,Action再读取该文件并返回给客户端,当然,在真实的项目中,这样做是很不安全的。 DownloadAction2.java:
package com.struts2;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction2 extends ActionSupport {
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getDownloadFile()
{
//以下几行先把get得到的文件名转换编码,否则中文文件名取不到文件
String utfFileName=null;
try {
utfFileName=new String(fileName.getBytes("iso8859_1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ServletActionContext.getServletContext().getResourceAsStream(utfFileName);
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
}
struts.xml配置:
<!-- result的type设为stream,参数inputName值与Action中的返回InputStream的方法getDownloadFile对应
contentDisposition参数attachment代表无论何种文件,均弹出下载框,而不是用浏览器打开,
filename指定下载时默认的文件名,通过${属性名}取action中的属性
-->
<action name="downloadFile2" class="com.struts2.DownloadAction2">
<result type="stream">
<param name="inputName">downloadFile</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
测试: http://localhost:8080/struts2/downloadFile2.do?fileName=index.jsp