Struts2的文件下载Action与普通的Action并没有太大的不同,仅仅是该Action需要提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口。FileDownloadAction.java如下
public class FileDownloadAction extends ActionSupport { // 该成员变量可以在配置文件中动态指定该值 private String inputPath; // inputPath的setter方法 public void setInputPath(String value) { inputPath = value; } /* 定义一个返回InputStream的方法, 该方法将作为被下载文件的入口, 且需要配置stream类型结果时指定inputName参数, inputName参数的值就是方法去掉get前缀、首字母小写的字符串 */ public InputStream getTargetFile() throws Exception { // ServletContext提供getResourceAsStream()方法 // 返回指定文件对应的输入流 return ServletActionContext.getServletContext() .getResourceAsStream(inputPath); } }
配置下载的Action与普通的Action并没有太大的不同,关键是需要配置一个类型为stream的结果,该stream类型的结果将使用文件下载作为响应。配置stream类型的结果需要指定如下属性:
1) contentType:指定被下载文件的文件类型。
2) inputName:指定被下载文件的入口输入流。
3) contentDisposition:指定下载的文件名。
4) bufferSize:指定下载文件时的缓存大小。
<action name="download" class="com.owen.app.action.FileDownloadAction"> <!-- 指定被下载资源的位置 --> <param name="inputPath">/WEB-INF/images/owen.jpg</param> <!-- 配置结果类型为stream的结果 --> <result type="stream"> <!-- 指定下载文件的文件类型 --> <param name="contentType">image/jpg</param> <!-- 指定由getTargetFile()方法返回被下载文件的InputStream --> <param name="inputName">targetFile</param> <param name="contentDisposition">filename="owen_logo.jpg"</param> <!-- 指定下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> </action> <action name="download2" class="com.owen.app.action.AuthorityDownAction"> <!-- 定义被下载文件的物理资源 --> <param name="inputPath">/WEB-INF/images/wjc_logo.zip</param> <result type="stream"> <!-- 指定下载文件的文件类型 --> <param name="contentType">application/zip</param> <!-- 指定由getTargetFile()方法返回被下载文件的InputStream --> <param name="inputName">targetFile</param> <param name="contentDisposition">filename="owen_logo.zip"</param> <!-- 指定下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> <!-- 定义一个名为login的结果 --> <result name="login">/WEB-INF/content/loginForm.jsp</result> </action>
JSP页面的实现:
<body> <h1>Struts 2的文件下载</h1> <ul> <li> 下载owen: <a href="download.action">下载图形文件</a> </li> <li> 下载owen的压缩文件: <a href="download2.action">下载压缩文件</a> </li> </ul> </body>
页面视图: