基于 Struts2 的文件下载

时间:2022-10-21 14:50:57

介于上篇我们讲述了基于 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>