实现文件下载的Action

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

看下面的一个原始的下载页面代码片段。

程序清单:codes\04\4.4\down\rawDown.html

 
 
  1. <h1>原始的下载</h1>  
  2. <ul>  
  3. <li>  
  4.     下载疯狂Java联盟的Logo:  
  5.     <a href="images/疯狂联盟.jpg">下载图形文件</a>   
  6. </li>  
  7. <li>  
  8.     下载疯狂Java联盟的Logo的压缩文件:  
  9.     <a href="images/wjc_logo.zip">下载压缩文件</a>  
  10. </li>  
  11. </ul>  

上面的页面包含两个下载的超级链接,两个链接的资源都是存在的,但因为第一个资源文件的文件名是中文文件名,如果单击第一个超级链接,将出现如图4.27所示的页面。

 

从图4.27所示页面中椭圆形框包围的地方,我们看到被下载的文件名变成了包含大量%的字符串,很明显,这种文件名显然无法取得需要下载的文件。

为了解决这个问题,我们使用Struts 2的文件下载支持来下载该文件。

Struts 2的文件下载Action与普通的Action并没有太大的不同,仅仅是该Action需要提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口。该Action类的代码如下。

程序清单:codes\04\4.4\down\WEB-INF\src\org\crazyit\app\action\FileDownloadAction.java

 

 
 
  1. public class FileDownloadAction  
  2.     extends ActionSupport   
  3. {  
  4.     //该属性可以在配置文件中动态指定该属性值  
  5.     private String inputPath;  
  6.     //依赖注入该属性值的setter方法  
  7.     public void setInputPath(String value)  
  8.     {  
  9.         inputPath = value;  
  10.     }  
  11.     /*  
  12.     定义一个返回InputStream的方法,  
  13.     该方法将作为被下载文件的入口,  
  14.     且需要配置stream类型结果时指定inputName参数,  
  15.     inputName参数的值就是方法去掉get前缀、首字母小写的字符串  
  16.     */ 
  17.     public InputStream getTargetFile() throws Exception   
  18.     {  
  19.         //ServletContext提供getResourceAsStream()方法  
  20.         //返回指定文件对应的输入流   
  21.         return ServletActionContext.getServletContext()  
  22.             .getResourceAsStream(inputPath);  
  23.     }  
  24. }  

从上面的Action中看到,该Action中包含了一个getTargetFile()方法,该方法返回一个InputStream输入流,这个输入流返回的是下载目标文件的入口。该方法的方法名为getTargetFile,则stream类型的结果映射中inputName参数值为targetFile

一旦我们定义了该Action,就可通过该Action来实现文件下载。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值