文档章节

Struts2文件下载(灵活控制MIME、FILENAME)

SPPan
 SPPan
发布于 2017/06/02 10:27
字数 298
阅读 6
收藏 0

下载流程概览:HttpRequest ---> DownloadAction ---> SUCCESS Result --> 输出流

STEP01 写一个DownloadAction

package study.action;  
import java.io.ByteArrayInputStream;  
import java.io.InputStream;  
import java.io.UnsupportedEncodingException;  
import javax.servlet.ServletContext;  
import org.apache.struts2.util.ServletContextAware;  
import com.opensymphony.xwork2.ActionSupport;  
public class DownloadAction extends ActionSupport implements  
        ServletContextAware {  
    private static final long serialVersionUID = 1L;  
    private ServletContext context;  
    private String filename;  
    private String mimeType;  
    private InputStream inStream;  
    @Override  
    public String execute() throws Exception {  
        mimeType = context.getMimeType(filename);  
        return SUCCESS;  
    }  
    public InputStream getInStream() {  
        inStream = context.getResourceAsStream("/doc/" + filename);  
        if (inStream == null) {  
            inStream = new ByteArrayInputStream("Sorry,File not found !"  
                    .getBytes());  
        }  
        return inStream;  
    }  
    public String getMimeType() {  
        return mimeType;  
    }  
    public void setFilename(String filename) {  
        try {  
            this.filename = new String(filename.getBytes("ISO8859-1"),"GBK");  
        } catch (UnsupportedEncodingException e) {  
        }  
    }  
    public String getFilename() {  
        try {  
            return new String(filename.getBytes(),"ISO8859-1");  
        } catch (UnsupportedEncodingException e) {  
            return this.filename;  
        }  
    }  
    @Override  
    public void setServletContext(ServletContext context) {  
        this.context = context;  
    }  
  
}

说明:

  1. 在下载的Action中,必须有个InputStream类型的field和对应的get方法。
  2. 下载时方便,将文件名、MIMETYPE都写在了Action中。

STEP02 编写配置文件

<action name="download" class="study.action.DownloadAction">  
    <result type="stream">  
        <param name="contentType">${mimeType}</param>
        <param name="inputName">inStream</param>  
        <param name="contentDisposition">attachment;filename="${filename}"</param>  
    </result>  
</action>

解释说明:

  1. 为了获取到MIMETYPE,利用了ServletContext的方法。所以必须获得ServlerContext这个对象。本例子中采用DI的方法,有Struts2在运行时注入。
  2. 为了能在HTTP Response中使用到MIMETYPE,所以在Action中提供了对应的get方法,以供OGNL表达式需要。

© 著作权归作者所有

共有 人打赏支持
SPPan
粉丝 10
博文 29
码字总数 15103
作品 0
成都
程序员
私信 提问
struts2学习笔记之文件下载

文件下载最重要的是设置响应头: 1 contentType,指定文件的MIME类型,使浏览器获知。如doc文件可以如下设置:application/msword 2 contentDisposition,告知文件名称如:attachment;filena...

美码师
2011/09/11
0
0
Content-Disposition 中文编码

今天在使用koa下载文件的时候,一直抱错'invalid charactor',关键是明明测试都没得问题的,郁闷了老半天 后来返现测试上用的是test.xlsx,而生产上是动态的文件名,有些时候会是中文,所以基...

小昭归来
2016/12/22
35
0
Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解

文件上传和文件下载是我们在web应用程序中常用的两个功能,在java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,首先我...

长平狐
2012/11/12
539
1
Struts 2中实现文件下载(修正中文问题)

在BlogJava上已经有一位作者阐述了文件上传的问题,地址是在Struts 2中实现文件上传,因此我就不再讨论那个话题了。我今天简单介绍一下Struts 2的文件下载问题。 我们的项目名为 struts2hel...

文文1
2015/12/02
57
0
JSP、Struts2下载中文文件名乱码问题

方案一: 原来处理下载的代码如下: response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); 下载的程序里有了这句,一般在......

长平狐
2012/11/12
464
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部