• 基于 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         <!--若指定下载文件类型 如pptzip格式 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>
  • 相关阅读:
    [LeetCode] 1103. Distribute Candies to People 分糖果
    [LeetCode] 994. Rotting Oranges 腐烂的橘子
    [LeetCode] 面试题 10.01.合并排序的数组
    [LeetCode] 207. Course Schedule 课程表
    Windows下利用virtualenvwrapper指定python版本创建虚拟环境
    Vagrant Ansible Playbook 安装一群虚拟机
    selenium grid的使用与配置
    selenium之 玩转鼠标键盘操作(ActionChains)
    Python3.7 dataclass 介绍
    简单的验证码识别
  • 原文地址:https://www.cnblogs.com/justlove/p/6817608.html
Copyright © 2020-2023  润新知