Struts2实现文件下载

Struts2提供了对文件下载的支持,使得我们可以轻松的实现文件下载功能。

1、实现文件下载

1、实现下载的Action

public class DownloadAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    //待下载文件的完整文件名(仅仅用于测试实现下载功能)
    private String fileName = "F:\\uploads\\20springmvc注解开发-商品修改功能开发controller.avi";
    //下载时使用该属性对文件重命名,默认值为default_file_name
    private String downFileName = "default_file_name";

    /**
     * @return  返回一个指向待下载文件的输入流
     * @throws IOException
     */
    public InputStream getDownloadFile() throws IOException  
    {
        return new FileInputStream(new File(fileName));
    }

    public String execute() throws UnsupportedEncodingException
    {
        //获取文件的原始文件名,包括扩展名
        downFileName = fileName.substring(fileName.lastIndexOf("\\", fileName.length()-1)+1);

        //解决文件下载时不能正确获取中文文件名的问题     
        downFileName =new String( downFileName.getBytes("UTF-8"),"ISO8859-1");
        return SUCCESS;
    }

2、Action配置

        <action name="download" class="downloadAction">
            <!-- stream类型的result用于文件下载 -->
            <result type="stream" name="success">
                <!-- 指定下载文件的类型:未知类型时采用application/octet-stream -->
                <param name="contentType">application/octet-stream;charset=UTF-8</param>

                <!-- attachment指定浏览器不会试图打开该文件,而是直接下载;fileName指定下载时显示的文件名(${downFileName}动态的获取Action中downFileName属性的值) -->
                <param name="contentDisposition">attachment;fileName="${downFileName}"</param>
                <!-- 指定用于下载的输入流:获取输入流的方法的方法名去掉get后,首字母小写后的内容,如getDownloadFile()-->
                <param name="inputName">downloadFile</param>
                <!-- 指定缓冲池大小,单位为字节 -->
                <param name="bufferSize">2048</param>
            </result>
        </action>

2、关于Struts2实现文件下载的各项笔记

使用Struts2下载文件,只需获取一个指向待下载文件的输入流即可,Struts2会将文件以流的方式下载至客户端

关于Action的配置说明

1)、首先要设置result的type属性为< result type=”stream” name=”success”>,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult

2)、在result中配置4项参数:

  • < param name=”contentType”>:内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片,由于事先不知道待下载文件的类型,所以使用 application/octet-stream;charset=UTF-8,此时浏览器会以字节流的方式处理,也就是下载了。

  • < param name=”contentDisposition”> :contentDisposition有两种取值,默认是 inline(内联的)。

    (a.)inline :此时浏览器会试图打开待下载的文件,比如说下载的文件是文本类型的,就直接在网页上打开,浏览器不能直接打开的才会打开下载框下载到本地。
    (b.)attachment :浏览器不尝试打开该文件,而是直接打开下载框进行下载。
    (c.) fileName=”${downFileName}” :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字(chrome下直接以该名字进行下载 )

  • < param name=”inputName”> :指定获取输入流的方法,struts2会自动调用该方法。该属性值要和Action中获取输入流的方法的方法名去掉get后一致(当然首字母要小写);如getDownloadFile()方法名去掉get 后, downloadFile

  • < param name=”bufferSize”> : 设置缓冲区大小 ,以字节为单位

3)、contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。

4)、如果下载的文件名含有中文,可能无法正确获取中文内容。

解决方案:

在Action中 对文件名进行处理
downFileName =new String( downFileName.getBytes(“UTF-8”),”ISO8859-1”);

或者 设置
response.setHeader(“Content-Disposition”, “attachment;fileName=”
+ java.net.URLEncoder.encode(downFileName ,”UTF-8”));

参考
http://blog.csdn.net/big1980/article/details/8581038?locationNum=14&fps=1
http://blog.csdn.net/hzc543806053/article/details/7538723

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值