Struts2文件下载

本文介绍如何使用Struts2框架实现文件下载功能,包括配置文件下载、动态指定下载资源及权限控制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读者可能会觉得实现文件下载太简单了,使用一个超级链接,在链接的href属性中指定要下载的文件就可以了! 的确,这样可以实现文件下载,但是如果遇到下载的是中文文件或者是需要为下载文件设置权限时,就变得无能为力了。

一、Struts2 实现文件下载

使用Struts2框架来控制文件的下载,关键是需要配置一个stream类型的结果,需要指定下面4个属性:

  1、contentType属性:指定被下载文件的文件类型。 和互联网MIME标准中的规定类型一致,如text/plain代表纯文本,text/xml代表XML,image/gif代表GIF图片,iamge/jpeg代表JPG图片

  2、inputName属性: 指定被下载文件的入口输入流。 例如,下面定义的Action的下载文件输入流入口为getTargetFile()方法,所以这里要相应的指定为targetFile。

  3、contentDisposition属性:指定文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。比如取值为:

                       attachment;filename="test.jpg",表示文件下载的时候保存的名字为test.jpg。如果直接写filename="test.jpg",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于如下写法:inline;filename="test.jpg".

  4、bufferSize属性: 指定下载文件时缓冲区大小。

 

配置上面4个属性,既可以在配置文件中配置,也可以在Action中设置该属性来完成配置。

二、在配置文件中指定下载资源

1、文件下载业务控制器

public class MyDownload extends ActionSupport {
    /**
     * @author rcy
     */
    private static final long serialVersionUID = 1L;
    private String inputPath;
    public void setInputPath(String inputPath) {
       this.inputPath = inputPath;
    }
    //根据配置文件inputPath属性值返回一个InputStream类型值
    public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext()
.getResourceAsStream(inputPath);
    }  
    public String execute()throws Exception{
       return SUCCESS;
    }
}

2、相应的Action的配置:
<action name="download" class="download.MyDownload">
	<!--指定资源下载位置 -->
	<param name="inputPath">/download/xiao.jpg</param>
	<!--指定success逻辑视图为一个stream类型,即流视图 -->
	<result name="success" type="stream">
		<!--下载文件类型 -->
		<param name="contentType">iamge/jpg</param>
		<!--下载文件位置 -->
		<param name="inputName">targetFile</param>
		<param name="contentDisposition">filename="hello.jpg"</param>
		<!--缓冲区大小 -->
		<param name="bufferSize">2000000</param>
	</result>
</action>

三、    在Action中指定下载资源(动态指定下载资源)

1、    动态指定下载资源的业务控制器

 public class Ddownload extends ActionSupport {
    /**
     * @author rcy
     */
    private static final long serialVersionUID = 1L;
    private String inputPath;// 下载文件的入口输入流
    private String contentType;//文件类型
    private String filename;//指定下载后的文件名
   
    public void setInputPath(String inputPath) {
       this.inputPath = inputPath;
    }
    public String getContentType() {
       return contentType;
    }
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
    public String getFilename() {
       return filename;
    }
    public void setFilename(String filename) {
       this.filename = filename;
    }
 
    public InputStream getTargetFile() throws Exception{
          return ServletActionContext.getServletContext()
.getResourceAsStream(inputPath);
    }
   
    public String execute()throws Exception{
       //调用相关业务逻辑方法,动态设置相关下载信息
       inputPath="/download/xiao.jpg";
       filename="test.jpg";
       contentType="image/jpg";
       return SUCCESS;
    }
}
2、相应的Action配置文件
<action name="Ddownload" class="download.Ddownload">
	<result name="success" type="stream">
		<param name="contentType">${contentType}</param>
		<param name="inputName">targetFile</param>
		<param name="contentDisposition">filename="${filename}"</param>
		<param name="bufferSize">2000000</param>
	</result>
</action>

四、文件下载的权限控制

明白了Struts2框架文件下载的原理后,就很容易实现文件下载的权限控制,可以在Action的execute()方法中加入用户合法身份的验证。当然,也可以使用拦截器来实现权限的控制,在拦截器中通过检查session对象同样可以限制权限。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值