FileDownloadAction:这个Action负责文件的下载控制。
Action中的fileName:接收请求传递的文件名(实际上是从页面传递过来)。
Action中的getInputStream()方法:以流的形式读取文件,是下载文件的入口。
package com.test.action; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 文件下载 * @author Luxh */ public class FileDownloadAction extends ActionSupport { private static final long serialVersionUID = -3036349171314867490L; //文件名 private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) throws UnsupportedEncodingException { //用UTF-8重新编码文件名,解决中文乱码 this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8"); } public InputStream getInputStream() throws UnsupportedEncodingException, FileNotFoundException{ HttpServletResponse response = ServletActionContext.getResponse(); //attachment,以附件的方式下载文件,会打开保存文件对话框;inline,以内联的方式下载,浏览器会直接打开文件 response.setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(fileName,"UTF-8"));//java.net.URLEncoder.encode(fileName,"UTF-8") 编码转换,解决乱码 //如果fileName是相对路径 //return ServletActionContext.getServletContext().getResourceAsStream(fileName); //如果fileName是绝对路径 return new FileInputStream(fileName); } @Override public String execute() throws Exception { return SUCCESS; } }
struts.xml配置文件:
<action name="fileDownload" class="com.test.action.FileDownloadAction"> <result name="success" type="stream"> <!-- 下载文件类型定义 --> <param name="contentType">application/octet-stream</param> <!-- 下载文件流定义 --> <param name="inputName">inputStream</param>
<!-- 下载文件处理方式 -->
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<!-- 下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> </action>
jsp页面:
1 <a href="fileDownload.action?fileName=<s:property value='myfilepath'/>">文件下载</a>
fileName的值在生成页面的时候动态生成。
如果报inputStream流找不到的异常,需要注意文件名是相对路径还是绝对路径,用相应的方法。