使用Struts 2框架实现文件下载

news/2024/7/4 2:59:51

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

  • 把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;

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

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

@Override
public 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 plain copy
    1. <action name="generalExcelAction" class="generalExcelAction">    
    2.   
    3.     <result name="success" type="stream">    
    4.   
    5.         <param name="contentType">application/vnd.ms-excel</param>    
    6.   
    7.         <param name="contentDisposition">attachment;filename="AllStudent.xls"</param>    
    8.   
    9.         <param name="inputName">downloadFile</param>    
    10.   
    11.     </result>    
    12. </action>   attachment:弹出 是否下载的询问.默认为inline 

转载于:https://www.cnblogs.com/langtianya/p/5034068.html


http://www.niftyadmin.cn/n/3069160.html

相关文章

实验一安卓开发微信页面设计

实验一安卓开发微信页面设计 功能要求&#xff1a; 1.页面具有标题 2.具有四个页面&#xff0c;页面具有底部选择框&#xff0c;同时具有选择事件&#xff0c;当点击选择事件的时候进行页面切换 3.页面内容不超出边界且清晰 思路分析&#xff1a; 该微信界面由三部分组成 1页面…

实验二: 安卓应用UI设计

实验目标和实验内容&#xff1a; 1、掌握UI设计中的layout布局&#xff08;约束布局&#xff09;与基本控件&#xff08;button、text、imageview等&#xff09;&#xff1b; 2、掌握复杂控件与adapter的使用 实验结果&#xff1a;&#xff08;实验小结与结果截图&#xff09…

使用C++名单在文档处理和学生成绩管理系统相结合

对于学生成绩管理系统&#xff0c;我并不陌生&#xff0c;几乎学习C人的语言。做项目会想到学生成绩管理系统&#xff0c;我也不例外。在研究中的一段时间C语言之后&#xff0c;还用C语言到学生管理系统&#xff0c;然后做几个链接。计数&#xff0c;这个系统是以前的系统上的改…

实验三: 服务与广播

实验目标和实验内容&#xff1a; 1、掌握服务的基本概念&#xff0c;能编写服务过程并进行调用&#xff1b; 2、掌握广播的基本概念&#xff0c;能实现广播通信。 3、需实现的具体功能为&#xff1a; 短信到来时自动产生的系统广播→激活音乐播放服务程序→活动组件程序使得停止…

Nginx的负载均衡 - 最少连接 (least_conn)

Nginx版本&#xff1a;1.9.1 我的博客&#xff1a;http://blog.csdn.net/zhangskd 算法介绍 我们知道轮询算法是把请求平均的转发给各个后端&#xff0c;使它们的负载大致相同。 这有个前提&#xff0c;就是每个请求所占用的后端时间要差不多&#xff0c;如果有些请求占用的时间…

《世界是数字的》读后感(3)

第六章 软件系统 6.1 操作系统 操作系统控制和分配计算机资源&#xff1a;首先&#xff0c;它负责管理CPU,调度和协调当前运行的程序(可在任务管理器中查看进程和任务)&#xff1b;其次&#xff0c;操作系统管理RAM(为有效利用RAM&#xff0c;一种思路是在必要时把程序的一部分…

cisco 路由器IOS操作系统

在路由器的使用和配置过程中&#xff0c;有时因操作失误或系统故障&#xff0c;致使路由器IOS操作系统的丢失&#xff0c;导致路由器无法进入正常工作&#xff0c;下面以Cisco2611为例&#xff0c;简要介绍一种方便可靠的IOS操作系统恢复的方法。一、路由器的基本组成及有关术语…

MongoDB介绍与windows下安装

MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。他支持的数据结构非常松散&#xff0c;是类 似json的bjson格式&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言…