从服务器发送一个文件到浏览器需要以下几个步骤

  • 把HTTP响应里的ContentType标头设置为被下载文件的内容类型。ContentType标头的作用是表明数据包里的数据是什么类型, 它由一个多媒体类型和一个子类型标识符组成(可以去http://www.iana.org/assignments/media-types /index.html 处查看所有标准内容类型)。若你不愿意查看内容类型,或者是你想让浏览器总是提示一个文件下载对话框,则只需要把它设置为 Application/Octet-stream(不区分大小写)。
  • 在HTTP响应里增加一个名为 Content-Disposition的标头并把它设置为attachment;filename="theFileName"。这里的"theFileName"为显示在下载对话框中文件的名字。

stream结果类型

Struts 2专门为文件下载提供了一种Stream结果类型。这个结果类型与我们经常使用的dispatcher结果类型不同,我们不需要为他配置一个JSP页面,下面为stream结果类型可以使用的参数:

参数名 - 数据类型 - 默认值 - 说明

inputName - String - inputStream - 一个动作类属性的名字,该属性返回的InputStream对象将被发送到浏览器 。

bufferSize - int - 1024 - 通过InputStream对象读取数据,通过OutputStream对象向浏览器发送数据时使用的缓冲区的长度。

contentType - String - text/plain - 用来设置HTTP响应里的Content-Type标头。

contentLength - int - 没有 -  用来设置HTTP响应里的Content-Length标头。

contentDisposition - String - inline - 用来设置HTTP响应里的Content-Disposition标头 。


示例:下载服务器上的指定文件

显示下载链接的页面:

<body><h1>Your Choice</h1><hr /><s:a href="/Struts2/simple_download_view.action">view_image</s:a><br /><s:a href="/Struts2/simple_download_save.action">download_image</s:a></body>

struts.xml配置信息:

<action name="simple_download_view" class="struts2.suxiaolei.filedownload.action.SimpleFileDownloadAction"><result name="success" type="stream"><param name="contentType">image/jpeg</param><param name="contentDisposition"> filename="picture.jpg"</param><param name="inputName">simpleDownloadStream</param></result></action>

<action name="simple_download_save" class="struts2.suxiaolei.filedownload.action.SimpleFileDownloadAction"><result name="success" type="stream"><param name="contentType">application/octet-stream</param><param name="contentDisposition"> filename="picture.jpg"</param><param name="inputName">simpleDownloadStream</param></result></action>

可以看出,两个action都是使用同一个类SimpleFileDownloadAction实现的,他们的不同点仅仅在于"contentType"参数不同,将contentType参数设置为"image/jpeg",则动作将文件发送给浏览器,并让浏览器显示其内容。将contentType参数设置为"application/octet-stream",则动作将以文件下载的方式发送给浏览器。换一种说法就是,若为"image/jpeg",就是告诉浏览器这是一个jpg文件,请显示它的内容;若为"application/octet-stream",就是告诉浏览器,问用户想不想保存这个文件。

支持下载的动作类:

public class SimpleFileDownloadAction extends ActionSupport implements ServletContextAware{private static final long serialVersionUID = 620526993016670680L;

private ServletContext context;

 @Overridepublic void setServletContext(ServletContext context) {this.context = context; }

public InputStream getSimpleDownloadStream() {return context.getResourceAsStream("/download/10.JPG"); }

 @Overridepublic String execute() {return SUCCESS; }}

该动作类实现了ServletContextAware接口,该接口提供一个setServletContext(ServletContext context)方法,实现该接口是为了方便获取ServletContext对象,该对象包含了一些辅助方法可以简化下载操作。 getSimpleDownloadStream() 这个方法是这个类实现下载功能的核心,该方法的方法名称可以任意取,但是要符合JavaBean属性的规范,此方法名与stream结果类型中的"inputName"参数有关,该参数的值为方法名去掉get前缀将第一个字母改为小写,例如,方法名为getSimpleDownloadStream,那么参数的值就为simpleDownloadStream。这是因为Struts 2框架会在动作类里寻找将"inputName"参数的值加上"get"并且将值的第一个字母改为大写的方法,由该方法获取InputStream的对象。

测试:

在浏览器中输入:http://localhost:8081/Struts2/simple_download.jsp,获得如下界面:

分别点击view_image链接与download_image链接:

看到下载对话框上,我们设置的filename="picture"生效了,出现下载对话框后,我们点击保存,将它保存到D盘下:

点击保存,现在查看D盘:

看到我们成功下载图片!

原文:http://www.cnblogs.com/suxiaolei/archive/2011/10/31/2230694.html

在servlet中,HttpServletResponse有一个表明响应所包含内容类型的参数。对PDF文件而言,内容类型是application/pdf。如果servlet没有设置类型,web浏览器很难决定如何处理这个文件,就需要配置下载类型。

resp.setContentType("application/pdf");==<param name="contentType">application/vnd.ms-excel</param>

Content-disposition头提供给浏览器确定HTTP响应内容的信息。当浏览器读到这些头信息后,它能确定:

  1. HTTP响应包含一个文件
  2. 包含在响应中的文件名
  3. 该文件是显示在浏览器主窗口中还是要用外部的应用查看

通过合适地设置Content-disposition的值,servlet能指示浏览器是“内嵌”显示文件还是把它当作附件处理。
                   例1.内嵌显示一个文件
                  Content-disposition: inline; filename=foobar.pdf
                  例2.往response里附加一个文件

Content-disposition: attachment; filename=foobar.pdf

下为Struts2 的代码
Xml代码

[html] view plaincopy
  1. <action name="generalExcelAction" class="generalExcelAction">
  2. <result name="success" type="stream">
  3. <param name="contentType">application/vnd.ms-excel</param>
  4. <param name="contentDisposition">attachment;filename="AllStudent.xls"</param>
  5. <param name="inputName">downloadFile</param>
  6. </result>
  7. </action>   attachment:弹出 是否下载的询问.默认为inline

使用Struts 2框架实现文件下载相关推荐

  1. java文件下载框架,使用Struts 2框架实现文件下载 - 消逝の纸屑

    从服务器发送一个文件到浏览器需要以下几个步骤 把HTTP响应里的ContentType标头设置为被下载文件的内容类型.ContentType标头的作用是表明数据包里的数据是什么类型,它由一个多媒体类型 ...

  2. Struts 2框架结构图

    网址:http://struts.apache.org/development/2.x/docs/the-struts-2-request-flow.html 核心控制器FilterDispatche ...

  3. iOS开发网络篇—使用ASI框架进行文件下载

    iOS开发网络篇-使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYView ...

  4. Struts+DAO框架搭建完成!(源码)

    今天做了这个Struts+DAO框架,可以说是又向SSH迈了一步.   做的过程中又发现了一些问题,但是在我和其他人的努力下一起解决了.这个问题是MyEclipse的Tomcat的启动问题.(已经解决 ...

  5. Struts 2框架创建的第一个项目

    创建我的第一个Struts 2项目. 用Struts 2框架创建一个简单的WEB项目. 效果演示 登录页面 登陆成功之后显示的页面 在程序正式开始之前注意引入架包(注意:架包放在WEB-INF下面的l ...

  6. Struts 2框架

    传统的Java EE开发采用JSP+Servlet+JavaBean的方式来实现MVC,但它有一个缺陷:程序员在编写程序的时候必须继承HttpServlet类.覆盖doGet()和doPost()方法 ...

  7. struts验证框架失效

    今天在练习struts2框架时,因为只是在初步的学习,使用验证框架时总是没起到预期的作用,控制台报告错误是 java.io.FileNotFoundException:http://www.opens ...

  8. Struts MVC 框架 (让你一步步成为高手)

    web应用的分层 交互层,表现数据,收集数据,也就是视图层,接受请求,通过处理层完成相应的响应.(V,C) 处理层,完成数据的处理,也就是业务层(M). MVC设计模式(应用观察者模式的框架模式) M ...

  9. struts的框架介绍

    1struts的框架介绍 struts2由struts1和webwork结合而来,更准确的的说是在struts1 的基础上按照webwork的设计理念发展起来的,实际上学过webwork的人更加容易平 ...

最新文章

  1. 人工智能时代,企业的未来离不开云专线
  2. [leetcode]剑指offer32-1.从上到下打印二叉树
  3. maven依赖循环引用_shiro+spring boot+mybatis启动循环引用问题解决思路和方案
  4. 比较流行的10个博客系统程序对比选择
  5. (转)Linux传输大文件(分割传输)
  6. SpringMVC中解决POST和GET请求中文乱码问题
  7. 玩玩直播,搭建一个流媒体服务器
  8. xd使用技巧_Adobe XD —你不知道的30条提示和技巧!
  9. 一起来学习Java浮点类型
  10. 人工智能时代:软件中的人工智能将如何改变程序员的角色
  11. 人工智能的本质就是计算机科学,人工智能跟意识的本质上的区别是什么?
  12. Win10桌面布局-透明剧中任务栏
  13. base64常用的前缀(excel,doc,pdf,png,jpg)
  14. Apifox—诠释国产接口管理工具新高度
  15. 推荐一些高效率的PC软件
  16. 射频功放学习之射频放大器稳定性(二)
  17. python 深度 视差 计算_NCC视差匹配计算视差图(python)
  18. 【六一为孩子建模吧】沐风老师3DMAX建模雕刻插件SculptTool使用教程
  19. 激光测距传感器选型指南 这2项重要指标一定要关注
  20. König定理及证明

热门文章

  1. JVM学习 - 体系结构 内存模型
  2. 年末裁员事件背后的启示录(2)
  3. concurrent: wai notify notifyAll
  4. 调用PDF的打印命令
  5. 使用卷积神经网络识别交通标志
  6. 手机没电了 鸿蒙还有用吗,记住这几个技巧,手机没电时可以有效延长使用时间...
  7. Redis操作Set类型
  8. Eureka、Zookeeper和Consul 的区别
  9. 日志规范之了解slf4j
  10. 数据库-数据库设计原则-范式概念