文档章节

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

SPPan
 SPPan
发布于 2017/06/02 10:27
字数 298
阅读 6
收藏 0
点赞 0
评论 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中的文件下载

以下是在Struts2中下载文件时,相关DownloadAction的配置信息 [xhtml] view plaincopyprint? <action name="download" class="com.jadyer.action.DownloadAction"> <result name="success" ......

王若冲 ⋅ 2012/03/24 ⋅ 0

Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解

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

长平狐 ⋅ 2012/11/12 ⋅ 1

Content-Disposition 中文编码

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

小昭归来 ⋅ 2016/12/22 ⋅ 0

JSP、Struts2下载中文文件名乱码问题

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

长平狐 ⋅ 2012/11/12 ⋅ 0

Struts 2中实现文件下载(修正中文问题)

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

文文1 ⋅ 2015/12/02 ⋅ 0

Struts2实现文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,...

颖辉小居 ⋅ 2015/11/26 ⋅ 0

从服务器下载文件

1、下载的servlet DownloadServlet.java 2、DownUtils

Bob2100 ⋅ 2016/12/18 ⋅ 0

Servlet 输出文件下载

1、如果下载的文件名是中文: 将文件名重新用“ISO8859_1”编码 2、下载自定义文件名: Response 设置头文件类型 “Content-disposition”,值为“ attachment;filename="文件名" ” 3、获取...

evilgod528 ⋅ 2013/03/26 ⋅ 0

使用Struts2控制文件下载

1 使用Struts2控制文件下载 可能很多人会觉得,文件下载太简单,直接在页面上给出一个超级链接,该链接的href属性等于要下载文件的文件名,不就可以实现文件下载了吗?大 部分时候的确可以实...

陈招林 ⋅ 2010/03/24 ⋅ 0

Content-disposition

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文...

贝爷1897 ⋅ 2017/04/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 46分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 56分钟前 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部