基于 Struts2 的文件下载
介于上篇我们讲述了基于 Struts2 的单文件和多文件上传,这篇我们来聊一聊基于 Struts2 的文件下载。
1、导 jar 包
commons-io-2.0.1.jar
struts2-core-2.3.15.3.jar
xwork-core-2.3.15.3.jar
struts2-sunspoter-stream-1.2.jar
2、web.xml 配置 Struts2 核心过滤器
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 5 </filter-class> 6 </filter> 7 8 <filter-mapping> 9 <filter-name>struts2</filter-name> 10 <url-pattern>/*</url-pattern> 11 </filter-mapping>
3、JSP 文件下载页(注意:链接中 filename 后跟的文件名需与 Action 文件下载路径中已知的文件名一致)
1 <a href="${pageContext.request.contextPath}/download?filename=一个程序员的自我修养.pdf">点击下载 一个程序员的自我修养</a>
4、实现文件下载上传的 DownloadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.InputStream; 7 import java.io.UnsupportedEncodingException; 8 import javax.servlet.ServletContext; 9 import org.apache.struts2.ServletActionContext; 10 import com.opensymphony.xwork2.ActionSupport; 11 12 public class DownloadAction extends ActionSupport { 13 14 //提供一个InputStream类型的输入流 15 private InputStream inputStream; //注意:在给InputSteam指定名称时,不能使用in 16 //创建一个文件名的属性 17 private String filename; 18 19 public String download() throws FileNotFoundException{ 20 21 //1.找到文件的存储路径 22 ServletContext servletContext = ServletActionContext.getServletContext(); 23 String realPath = servletContext.getRealPath("/WEB-INF/file"); 24 //2.根据文件路径和文件名new一个新文件 25 File file = new File(realPath,filename); 26 27 //3.把文件读到一个InputStream中 28 inputStream = new FileInputStream(file); 29 //4.返回一个SUCCESS 30 return SUCCESS; 31 //5.由一个叫做stream的结果类型为我们把剩下的事情做完。 32 } 33 34 public InputStream getInputStream() { 35 return inputStream; 36 } 37 38 public void setInputStream(InputStream inputStream) { 39 this.inputStream = inputStream; 40 } 41 42 public String getFilename() { 43 44 //解决中文文件名在下载过程出现乱码问题,struts.xml中也需添加charset=iso-8859-1 45 try { 46 filename=new String(filename.getBytes(),"iso-8859-1"); 47 } catch (UnsupportedEncodingException e) { 48 // TODO Auto-generated catch block 49 e.printStackTrace(); 50 } 51 return filename; 52 } 53 54 public void setFilename(String filename) { 55 this.filename = filename; 56 } 57 58 }
5、配置 struts.xml
1 <struts> 2 <!--constant修改struts2的默认配置值 --> 3 <!--修改struct2称为开发模式,修改配置之后会自动加载 --> 4 <constant name="devMode" value="true"></constant> 5 6 <package name="package1" extends="struts-default"> 7 <result-types> 8 <result-type name="streamx" class="cc.fozone.struts2.StreamResultX"/> 9 </result-types> 10 <action name="download" class="com.fhcq.action.DownloadAction" method="download"> 11 <result name="success" type="streamx"> 12 <!--给stream的结果类型注入参数:Content-Type 设置消息头,告知浏览器,响应正文的MIME类型--> 13 <!--若指定下载文件类型 如ppt\zip格式 application/vnd.ms-powerponit,application/zip--> 14 <param name="contentType">application/octet-stream;charset=iso-8859-1</param> 15 <!--contentDisposition:设置响应消息头,告知浏览器以下载的方式打开--> 16 <!--使用EL表达式,来动态获取文件名--> 17 <param name="contentDisposition">attachment;filename=${filename}</param> 18 <!--inputName属性:配置输入流。其实就是把动作类中的输入流的字段名写进来--> 19 <param name="inputName">inputStream</param> 20 </result> 21 </action> 22 </package> 23 </struts>