文档章节

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
531
1
JSP、Struts2下载中文文件名乱码问题

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

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

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

文文1
2015/12/02
57
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx 配置url 跳转

Step 1:前言 公司一个管理后台,每次访问要写很长的参数,想直接访问域名就去管理页面 Step 2:配置 location / { rewrite ^/$ http://pay-admin.sasha-lab.com/index.php?m=admin&c...

Linux_Anna
12分钟前
0
0
php7在FreeBSD系统下静态编译iconv,导致BUS ERROR (core dump)解决

bug页面: https://bugs.php.net/bug.php?id=72198 触发此bug需要很多条件: FreeBSD系统(10.0以上),Linux系统、MacOS下均无此问题 静态编译iconv扩展,动态iconv扩展也无此问题 系统安装了...

hell0cat
15分钟前
2
0
FireFox下载时文件名乱码问题解决

String filename = java.net.URLEncoder.encode(file.getName(), "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + filename);......

放飞E梦想O
23分钟前
0
0
Spring声明式事务不回滚问题

注解 @Transactional 声明事务 内部调用方法不会走代理方式调用,而是类内部的函数调用,有事务注解也不会开启事务 但是当A有事务调用B时,B会加入A事务中,使之为同一事务 A无事务 ,B有事务...

职业搬砖20年
24分钟前
1
0
高并发的“大杀器”:异步化、并行化

高并发的大杀器:异步化 同步和异步,阻塞和非阻塞 同步和异步,阻塞和非阻塞,这几个词已经是老生常谈,但是还是有很多同学分不清楚,以为同步肯定就是阻塞,异步肯定就是非阻塞,其实他们并...

微笑向暖wx
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部