实现文件下载的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来实现文件下载。

 


 

本文转自 

fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/891319 ,如需转载请自行联系原作者

相关文章
|
3天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
350 123
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
2天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
181 127
|
5天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
484 106
|
2天前
|
Web App开发 前端开发 API
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
215 124
|
6天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
6天前
|
缓存 JavaScript 前端开发
JavaScript 的三种引入方法详解
在网页开发中,JavaScript 可通过内联、内部脚本和外部脚本三种方式引入 HTML 文件,各具适用场景。本文详解其用法并附完整示例代码,帮助开发者根据项目需求选择合适的方式,提升代码维护性与开发效率。
221 110

热门文章

最新文章