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

基于 Struts2 的文件下载的更多相关文章

  1. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...

  2. 关于Struts2的文件下载

    首先先来说下关于文件下载的原理: 服务端为客户端提供了一个下载服务,所以服务端需要一个输出流(把客户请求下载的文件输出),相对于服务端来说,客户端需要下载接收一个文件,所以它需要一个输入流(接收文件) ...

  3. 基于 Struts2 的单文件和多文件上传

    文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利.Struts2 已经有默认的 upload 拦截器.我们只需要写参数,它就会自 ...

  4. 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序

    基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序 不知道为什么,保存的时候显示有一个连接为违禁内容,可能是…………. ...

  5. 基于Struts2开发快递收发系统 毕业设计 源码

    基于Struts2开发快递收发系统 开发环境:  Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat6+MySql数据库 运行效果图: 此源码经过详细测试 保证 ...

  6. Struts2笔记--文件下载

    Struts2提供了stream结果类型,该结果类型是专门用于支持文件下载功能的.配置stream类型的结果需要指定以下4个属性. contentType:指定被下载文件的文件类型 inputName ...

  7. 基于struts2的学生报道管理系统(附github源码地址)

    本项目参考了<java web轻量级开发全体验>,加入了对mysql的支持. 一.基本业务功能 通过struts2框架,结合mysql数据库构建一个学生报到管理系统,来模拟学生报到登记的过 ...

  8. 基于struts2的记住账号密码的登录设计

    一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示.这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计. 登录功能的制作,首先将jsp界面搭建出来 ...

  9. 基于Struts2框架的文件下载 --- Struts2

    一.Struts2指定类型文件的下载 1.最终功能实现的截图:(点击文件下载链接,下载文件 ) 2.核心代码 index.jsp: <%@ page language="java&qu ...

随机推荐

  1. 编译的java工程压缩上传到linux服务器上后,中文的类名显示乱码

    首先声明,类名是用中文命名的,这个别人写的,不允许修改. 本地用7zip软件压缩成zip包,传到服务器解压,发现中文的class文件名称是乱码. 解决办法: 方法一:使用jar命令打成jar包,传到服 ...

  2. HashMap源码分析-基于JDK1.8

    hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...

  3. 51 nod 1046 A^B Mod C

    1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^ ...

  4. spring-boot RestTemplate 连接池

    以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用,后来用spring-boot, 发现 RestTemplate 挺好用. 简单介绍下: 什么是RestTemplat ...

  5. 精心整理的十个必须要知道CSS+DIV技巧

    1.css font的简写规则  当我们写字体样式的时候,我们也许会这样子写 font-size: 1em; line-height: 1.5em; font-weight: bold; font-s ...

  6. 为FreeBSD安装adobe flash插件

    参考 FreeBSD官方手册浏览器一章. pkg install nspluginwrapper nspluginwrapper 是一个辅助安装配置 NetScape Plugin的工具. 可以为Ne ...

  7. Element-UI 表格 列过多内容换行问题

    本文地址:http://www.cnblogs.com/veinyin/p/8487098.html  一般表格不会有很多列,所以在使用时会很方便,但是如果有25+个列时,就会发现宽度完全不够用,只有 ...

  8. Java 对象初始化生命周期

    class Man { String name; int age = 20; public static int sex = 1; Man(String name, int age) { //supe ...

  9. mysql取字段名注意事项!!!!千万不能和关键字同名

    今天就碰到一个恶心的问题,更新时update sql语句报错,查了半天感觉没问题啊,后来一行一行定位,终于找到原因了, 原来是有个字段是show,和mysql关键字冲突了,坑爹! 改了个名字就好了,或 ...

  10. 【FCS NOI2018】福建省冬摸鱼笔记 day2

    第二天. 同学还是不带本子记笔记.dalao. 第二天:图论,讲师:@ExfJoe 全程划水,前面都讲水算法[虽然我可能已经忘记了]什么最短路,Tarjan,最小生成树,2SAT,差分约束啥的,我现在 ...