java

位置:IT落伍者 >> java >> 浏览文章

struts2实现文件下载


发布日期:2021年05月31日
 
struts2实现文件下载

使用Struts控制文件下载 可能很多人会觉得文件下载太简单直接在页面上给出一个超级链接该链接的href属性等于要下载文件的文件名不就可以实现文件下载了吗?大部分时候的确可以实现文件下载但如果该文件的文件名为中文文件名则会导致下载失败或者应用程序需要在让用户下载之前进行进一步检查比如判断用户是否有足够权限来下载该文件等

看下面的一个原始的下载页面代码片段 <h>原始的下载</h> <ul><li> <! 包含中文文件名的下载链接 > 下载Struts的Logo<a images/中gif>下载图形文件</a> </li><li> 下载Struts的Logo的压缩文件<a >下载压缩文件</a> </li></ul> 上面页面的包含两个下载的超级链接两个链接的资源都是存在的但因为第一个资源文件的文件名是中文文件名如果单击第一个超级链接将出现如下图所示的页面 从图中页面中椭圆形框包围的地方我们看到被下载的文件名变成了包含大量%的字符串很明显这种文件名显然无法取得需要下载的文件 为了解决这个问题我们使用Struts的文件下载支持来下载该文件

实现文件下载的Action Struts的文件下载Action与普通的Action并没有太大的不同仅仅是该Action需要提供一个返回InputStream流的方法该输入流代表了被下载文件的入口该Action类的代码如下 public class FileDownloadAction implements Action { //该属性是依赖注入的属性该属性可以在配置文件中动态指定该属性值 private String inputPath; //依赖注入该属性值的setter方法 public void setInputPath(String value) { inputPath = value; } /* 下载用的Action应该返回一个InputStream实例 该方法对应在result里的inputName属性值为targetFile */ public InputStream getTargetFile() throws Exception { return ServletActionContextgetServletContext()getResourceAsStream(inputPath); } //处理用户请求的execute方法该方法返回success字符串 public String execute() throws Exception { return SUCCESS; } } 从上面的Action中看到该Action中包含了一个getTargetFile()方法该方法返回一个InputStream输入流这 个输入流返回的是下载目标文件的入口该方法的方法名为getTargetFile表明该Action有一个targetFile属性来返回下载文件 一旦我们定义了该Action就可通过该Action来实现文件下载

配置Action 配置该文件下载的Action与配置普通的Action并没有太大的不同需要在配置普通Action的基础之上在加上额外的download的拦截器引用 除此之外关键是需要配置一个类型为stream的结果配置stream类型的结果时需要指定如下四个属性 ? contentType指定被下载文件的文件类型 ? inputName指定被下载文件的入口输入流 ? contentDisposition指定下载的文件名 ? bufferSize指定下载文件时的缓沖大小 因为stream结果类型的逻辑视图是返回给客户端一个输入流因此无需指定location属性 提示配置stream类型的结果时因为无需指定实际的显示的物理资源所以无需指定location属性只需要指定inputName属性该属性指向被下载文件 下面是配置该下载所用的Action类的配置文件片段 <?xml version= encoding=GBK?> <! 指定Struts配置文件的DTD信息 > <!DOCTYPE struts PUBLIC //Apache Software Foundation//DTD Struts Configuration //EN dtd> <struts> <! 配置Struts国际化资源文件的baseName > <constant name=strutscustominresources value=globalMessages/> <! 配置Struts应用的编码集 > <constant name=strutsinencoding value=GBK/> <package name=lee extends=strutsdefault> <! 配置下载的拦截器引用 > <defaultactionref name=download/> <action name=download class=leeFileDownloadAction> <! 指定被下载资源的位置 > <param name=inputPath>\images\中gif</param> <! 配置结果类型为stream的结果 > <result name=success type=stream> <! 指定下载文件的文件类型 > <param name=contentType>image/gif</param> <! 指定下载文件的文件位置 > <param name=inputName>targetFile</param> <param name=contentDisposition>filename=strutsgif</param> <! 指定下载文件的缓沖大小 > <param name=bufferSize></param> </result> </action> </package> </struts> 如果通过上面的Struts提供文件下载支持来实现文件下载就可以实现包含中文文件名的文件下载

上面的下载的方式没有办法动态的给定文件名于是就将上面的方法进行了改进

首先strutsxml配置文件如下

view plaincopy to clipboardprint?

<! 文件下载>

<action name=filedown class=comactionsFileDownActions>

<param name=inputPath>/upload/</param>

<result name=success type=stream>

<param name=contentType>image/gif</param>

<param name=inputName>targetFile</param>

<param name=contentDisposition>filename=downloadgif</param>

<param name=bufferSize></param>

</result>

</action>

<! 文件下载>

<action name=filedown class=comactionsFileDownActions>

<param name=inputPath>/upload/</param>

<result name=success type=stream>

<param name=contentType>image/gif</param>

<param name=inputName>targetFile</param>

<param name=contentDisposition>filename=downloadgif</param>

<param name=bufferSize></param>

</result>

</action>再就是html中加入

<a >download</a>

下面给出FileDownActions的代码

view plaincopy to clipboardprint?

package comactions;

import javaioInputStream;

import orgapachestrutsServletActionContext;

import comopensymphonyxworkActionSupport;

public class FileDownActions extends ActionSupport {

private String download;

private String inputPath;

public String getInputPath() {

return inputPath;

}

public void setInputPath(String inputPath) {

thisinputPath = inputPath;

}

public String getDownload() {

return download;

}

public void setDownload(String download) {

thisdownload = download;

}

public InputStream getTargetFile() throws Exception

{

return ServletActionContextgetServletContext()getResourceAsStream(inputPath+download);

}

public String execute(){

return SUCCESS;

}

}

package comactions;

import javaioInputStream;

import orgapachestrutsServletActionContext;

import comopensymphonyxworkActionSupport;

public class FileDownActions extends ActionSupport {

private String download;

private String inputPath;

public String getInputPath() {

return inputPath;

}

public void setInputPath(String inputPath) {

thisinputPath = inputPath;

}

public String getDownload() {

return download;

}

public void setDownload(String download) {

thisdownload = download;

}

public InputStream getTargetFile() throws Exception

{

return ServletActionContextgetServletContext()getResourceAsStream(inputPath+download);

}

public String execute(){

return SUCCESS;

}

}

view plaincopy to clipboardprint?

通过上面的操作就可以实现文件的下载了

上一篇:Hibernate的基本组件

下一篇:Hibernate简介