zoukankan      html  css  js  c++  java
  • struts实现文件下载

      今天学习了如何用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 
    下载缓冲区的大小
  • 相关阅读:
    VS2013快速安装教程
    软件工程课程的感想
    GitHub和Microsoft TFS对比有什么优势
    拼接素数
    C语言程序题
    vue中的实例方法的底层原理
    ios 安卓
    防抖
    伪数组转真数组的放法
    http和https的一种能力?
  • 原文地址:https://www.cnblogs.com/liuling/p/asdfadsf.html
Copyright © 2011-2022 走看看