今天学习了如何用struts实现文件下载的功能,可以将服务器的文件下载到客户端。

  其实不用struts也可以实现下载,可以直接用一个链接,href里面写文件的目录。如:

1 <a href="download/123.rar">123.rar</a>

  这种方法简单,不过它只能下载压缩文件,而其他一些文件如文本文件、图片等都会直接在页面上面显示出来而不会下载到客户端,所以此方法不可取。

  下面介绍另一种方法,也就是用struts实现文件的下载。首先,在WebRoot目录下面建一个文件夹download,可以将文件上传到这个目录下面。下载文件也从该目录下面下载。然后新建一个TestAction类,代码如下(struts的配置这里就不讲了):

 1 public class TestAction extends ActionSupport{
 2
 3     public String fileLoad() throws IOException{
 4         String fileName = ServletActionContext.getRequest().getParameter("fileName");
 5         //要处理中文乱码问题
 6         fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
 7         //要下载的哪个文件
 8         String path = ServletActionContext.getServletContext().getRealPath("/");//得到项目的根目录
 9         InputStream is = new FileInputStream(path+"/download/"+fileName);
10
11         //下载到哪里?客户端
12         HttpServletResponse response = ServletActionContext.getResponse();
13         OutputStream os = response.getOutputStream();
14         //弹出下载的框filename:提示用户下载的文件名
15         response.addHeader("content-disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName,"utf-8"));
16
17         byte[] b = new byte[1024];
18         int size = is.read(b);
19         while(size>0){
20             os.write(b,0,size);
21             size = is.read(b);
22         }
23         is.close();
24         os.close();
25         return null;
26     }
27
28 }

index.jsp的内容如下:

1 <a href="test!fileLoad.action?fileName=A.java">A.java</a>
2
3 <a href="test!fileLoad.action?fileName=jquery.txt">jquery.txt</a>
4
5 <a href="test!fileLoad.action?fileName=中文.txt">中文.txt</a>

文件下载分为两步:读文件、写文件。从服务器读取,然后写到客户端去,所以需要InputStream和OutputStream。然后设置content-disposition弹出下载提示框,提示用户下载的文件名和从何处下载的。下面一段代码是读写文件的金典代码,我也不多讲了!

1 byte[] b = new byte[1024];
2 int size = is.read(b);
3 while(size>0){
4     os.write(b,0,size);
5     size = is.read(b);
6 }

实现下载功能要注意:因为是用链接传过来的文件名,所以必须处理中文乱码问题。

以上方法实现下载功能没有使用struts2里面自带的文件下载。下面使用struts2自带的方法实现文件下载功能。

struts.xml配置如下:

 1 <struts>
 2    <package name="com.action" extends="struts-default">
 3            <action name="download" class="com.action.FileLoadAction">
 4                <result name="success" type="stream">
 5                    <param name="contentType">application/txt;</param>
 6                    <param name="inputName">downloadFile</param>
 7                    <param name="bufferSize">2048</param>
 8                </result>
 9            </action>
10    </package>
11 </struts>    

FileLoadAction.java类

 1 public class FileLoadAction extends ActionSupport{
 2     private String fileName;
 3
 4     public String getFileName() {
 5         return fileName;
 6     }
 7     public void setFileName(String fileName) throws UnsupportedEncodingException {
 8         this.fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
 9     }
10     public InputStream getDownloadFile() throws UnsupportedEncodingException, FileNotFoundException{
11         //attachment为进行文件保存,这个时候还可以附件另一个参数filename表示保存时的缺省名称
12         //inline为在线打开,不进行保存
13         ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
14         HttpServletResponse response = ServletActionContext.getResponse();
15         return new FileInputStream("d:/"+this.getFileName());
16     }
17     public String downloadFile(){
18         return SUCCESS;
19     }
20 }

index.jsp代码如下:

1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%@taglib prefix="s" uri="/struts-tags" %>
3
4 <s:url value="download.action" var="url">
5     <s:param name="fileName">中文.txt</s:param>
6 </s:url>
7 <a href="${url }">点击下载</a>

action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream,,struts2会寻找一个返回类型为InputStream的方法getInputStream()(方法名最好为getInputStream,有人说此方法名可以为别的可能需要与struts.xml中的inputName保存一致下面有解释,另一种理解:action中定义一个返回InputStream的方法,该方法作为被下载文件的入口,且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串。

下面则列出了和下载有关的一些参数列表:

参数说明 
contentType 
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片 
 
inputName 
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法 
 
contentDisposition 
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为: 
 
attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt" 
 
bufferSize 
下载缓冲区的大小

struts实现文件下载相关推荐

  1. struts实战--文件下载

    struts实现文件下载 一.页面 这个页面的里面的简历资料就是我们的下载入口. <%@ page language="java" pageEncoding="UT ...

  2. Struts2之struts2文件下载详解

    一.学习案例:通过在downloadfile.jsp页面点击"下载文件",查看文件是否可以成功下载. 二.案例分析:struts2文件下载只需简单配置即可. a)先在下载页面(do ...

  3. struts 文件下载

    =============================struts 文件下载  ================================== 步骤一: JSP页面 <a href=& ...

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

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

  5. java struts 文件下载_Struts2文件下载实例

    通过<Struts2文件下载简介>教程的学习,读者已经了解了使用 Struts2 框架实现在指定的目录中下载指定文件的功能.下面通过案例演示文件下载功能. 1)创建下载页面 在 strut ...

  6. java通过struts实现web中的文件下载

    上一篇已经记录了 web中的文件上传功能 java通过struts实现web中的文件上传 本篇记录下载功能 定义一个Action类,FileDownload.java package com.stru ...

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

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

  8. Struts文件下载

    前三个动态提供 一般后面的两个就是用struts预设 1024b 即2KbcontentType="text/html";contentDisposition="atta ...

  9. struts2之配置文件struts.xml详解

    struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解  以便于理解 和修改 <?xml version=" ...

  10. struts2的文件上传和文件下载

    实现使用Struts2文件上传和文件下载: 注意点: (1)对应表单的file1和私有成员变量的名称必须一致 <input type="file" name="fi ...

最新文章

  1. 姜宁谈红帽绩效考核:不关心员工具体做什么
  2. 鸿蒙之后华为把欧拉也捐了,还承诺不做欧拉商用发行版
  3. centos6 64位服务器的基本初始化
  4. 【转载】BTEs业务交易事件初识
  5. 前端学习(2439):jsonbin-init的使用
  6. vue光标插入内容_vue项目中在可编辑div光标位置插入内容的实现代码
  7. X File 解析中遇到的问题和最终解决办法
  8. Random walk 和 random walk with Restart理解
  9. mysql truncate 日期_(LINQ to Entities)使用日期判断条件Truncate日期函数
  10. matlab电力系统建模仿真实验,电力系统建模及仿真课程设计
  11. 蓝桥杯题库及答案python版_蓝桥杯试题库的历届真题版.doc
  12. 读《线上幽灵:世界头号黑客米特尼克自传》 有感
  13. 张磊:什么才是企业真正的护城河
  14. 电视厂商渐进式占领“高清奥运”
  15. C Prime plus 第七章练习题
  16. 干货 | 关于等效电路图画法,不得不学的几个小窍门!
  17. Relief特征提取算法实战
  18. [转载]汇编eax寄存器和AX,AH,AL之间的关系
  19. 知识点滴 - 多重验证MFA
  20. Scrapy爬虫框架视频学习

热门文章

  1. DRLSE 水平集算法总结
  2. U-he The Dark Zebra for Mac(预设合成器)
  3. Android中保存网络图片到SD卡
  4. octave c++函数中调用fortran77子程序
  5. ubantu 系统安装apache 和mysql
  6. corosycnpacemaker的高可用web集群
  7. JS对象编程的原型和构造函数混合使用
  8. 百度直达号选错了对手 阿里腾讯还太嫩 干掉美团更直接
  9. WEB标准布局(DIV+CSS)学习笔记(二)--DIV的布局基础
  10. java代码输出1到100的质数