基于 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>
posted @ 2017-05-06 18:28  长情白月光  阅读(306)  评论(0编辑  收藏  举报