public class TestAction extends ActionSupport{
   
    public String fileLoad() throws IOException{
        String fileName = ServletActionContext.getRequest().getParameter("fileName");
        //要处理中文乱码问题
        fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
        //要下载的哪个文件
        String path = ServletActionContext.getServletContext().getRealPath("/");//得到项目的根目录
        InputStream is = new FileInputStream(path+"/download/"+fileName);
       
        //下载到哪里?客户端
        HttpServletResponse response = ServletActionContext.getResponse();
        OutputStream os = response.getOutputStream();
        //弹出下载的框filename:提示用户下载的文件名
        response.addHeader("content-disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName,"utf-8"));
       
        byte[] b = new byte[1024];
        int size = is.read(b);
        while(size>0){
            os.write(b,0,size);
            size = is.read(b);
        }
        is.close();
        os.close();
        return null;
    }
   
}

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

byte[] b = new byte[1024];
        int size = is.read(b);
        while(size>0){
            os.write(b,0,size);
            size = is.read(b);
        }

<struts>
   <package name="com.action" extends="struts-default">
           <action name="download" class="com.action.FileLoadAction">
               <result name="success" type="stream">
                   <param name="contentType">application/txt;</param>
                   <param name="inputName">downloadFile</param>
                   <param name="bufferSize">2048</param>
               </result>
           </action>
   </package>
</struts>

public class FileLoadAction extends ActionSupport{
    private String fileName;

public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) throws UnsupportedEncodingException {
        this.fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
    }
    public InputStream getDownloadFile() throws UnsupportedEncodingException, FileNotFoundException{
        //attachment为进行文件保存,这个时候还可以附件另一个参数filename表示保存时的缺省名称
        //inline为在线打开,不进行保存
        ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
        HttpServletResponse response = ServletActionContext.getResponse();
        return new FileInputStream("d:/"+this.getFileName());
    }
    public String downloadFile(){
        return SUCCESS;
    }
}

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>

<s:url value="download.action" var="url">
    <s:param name="fileName">中文.txt</s:param>
</s:url>
<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 
下载缓冲区的大小

struts2download的更多相关文章

随机推荐

  1. iOS学习-UITextField设置placeholder的颜色

    UITextField *text = [[UITextField alloc] initWithFrame:CGRectMake(, , , )]; text.borderStyle = UITex ...

  2. 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具

      2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...

  3. 小公司0成本基于Pythony的单元\GUI\Web自动化\性能的几个开源软件测试工具

    以下是当前流行的几款适合小公司0成本的几个开源软件测试解决方案: 1.单元测试 a.unittest :Python自带的单元测试框架 b.pyunit:Junit的Python版本 2.使用Pyho ...

  4. svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupted的解决办法

    今天在svn提交的时候它卡顿了一下,我以为已经提交完了,就按了一下,结果就再也恢复不了,也继续不了了... 报错 cleanup failed–previous operation has not f ...

  5. mybatis-generator 1.3.5支持流式 fluent 方法

    在以往的无数此写model的过程中,大家都会烦恼model的set方法写一堆.比如 Person p = new Person(); p.setName("name"); p.se ...

  6. 偷懒小工具 - Excel导出公共类

    说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Excel大体格式如图 很简单的列表,标题加背景色,然后不同类型,显示方式不一样.对齐方式不一样.不 ...

  7. Linux sudo 命令的应用

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  8. bzoj 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...

  9. C#基础强化-进程操作

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  10. Linux学习笔记<五>

    管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...