`

struts1的下载(转)

 
阅读更多
上个星期,要做一个利用struts1.x作文件下载功能的网页,要求点击链接后,开始弹出下载对话框,下载成功后,转向成功信息页面,失败后,转向error信息页面。
于是找啊找,单纯的文件下载功能还是挺容易的,既可以自己写,也可以用类似smartupload这类现成的包。 至于为什么不用直接的链接,是为了防止服务器文件结构泄漏,有心人其他文件也可以随意下载,那岂不是麻烦?
如果要自己写得话,action的写法大致有三 1, 用输入流,输出流 2, 用dispatcher 3, 用downloadAction
方法3是struts推荐的官方写http://wiki.apache.org/struts/StrutsFileDownload 写的时候,只要继承downloadAction类,然后重写getStreamInfo方法就可以了。但是看一下这个类的src http://www.docjar.org/html/api/org/apache/struts/actions/DownloadAction.java.html 就明白,这个类的getStreamInfo会把结果传给execute方法,而execute方法的最后却被注明

Java代码 
// Tell Struts that we are done with the response. 
return null; 


意味着根本不可能做任何转向。至于试着再重写一下execute方法,好像没有人这么办,在google.com上以关键字downloadAction redirect 或者downloadAction foward,也没有任何可以有用的结果,所以首先放弃了这个方法。不过这个方法还是最简单最可靠的,仿照它给的例子,几行代码就完事,真好。


方法2 以前单独在jsp中,这种方法可能挺流行的,不过在action中一样行不通。 例如代码
Java代码 
<pre name="code" class="java">
public ActionForward execute(ActionMapping mapping, ActionForm form,  
            HttpServletRequest request, HttpServletResponse response)  {  
            FileDownLoadForm fdform =(FileDownLoadForm)form;  
            String path = fdform.getFilePath();  
          
            response.setContentType("application/x-download");  
            String filenamedownload = path;  
            String filenamedisplay = path.substring(path.lastIndexOf("/")+1);  
              
            try {  
                filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");  
                response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);  
                RequestDispatcher dispatcher = request.getRequestDispatcher(filenamedownload);  
                if(dispatcher != null)  
                {  
                    dispatcher.forward(request,response);  
                }  
                response.flushBuffer();  
  
               return null ;  
               //  return mapping.findForward("success");  
            }catch(FileNotFoundException e){  
                e.printStackTrace();          
                return mapping.findForward("error");  
            }catch(Exception e){  
                e.printStackTrace();  
                return null;  
            }  
  
}
</pre> 
  
     解释1  为什么成功后return null   因为前面response 已经提交过,没办法再forward,否则报错
     解释2  为什么FileNotFoundException转到error画面,因为对话框中,用户如果点取消按钮,tomcat会报ClientAbortException
假如连这个exception都抓掉,然后进行forward,一样会报response已经提交过的错误,根本无法转向。所以干脆就留
着它好了。
     方法1  其实根方法3一样,输入流,输出流,有兴趣地可以用IOUtils.copy(in, response.getOutputStream());
没兴趣的可以参照以下代码,我也是参考论坛上一位兄弟的

Java代码 
 

Java代码 
public ActionForward execute(ActionMapping mapping, ActionForm form,  
                HttpServletRequest request, HttpServletResponse response)  {  
              
            FileDownLoadForm fdform =(FileDownLoadForm)form;  
            String path = fdform.getFilePath();  
              
            BufferedInputStream   bis = null;  
            BufferedOutputStream  bos = null;  
            InputStream fis = null;  
            OutputStream fos = null;  
              
            try{  
  
                File uploadFile = new File(path);  
  
          
                fis = new FileInputStream(uploadFile);  
                bis = new BufferedInputStream(fis);  
                fos = response.getOutputStream();  
                bos = new BufferedOutputStream(fos);  
                  
  
  
                response.reset();  
                response.setHeader("Content-disposition", "attachment;filename =" + URLEncoder.encode(path.substring(path.lastIndexOf("/")+1), "utf-8"));  
  
  
                int bytesRead = 0;  
                byte[] buffer = new byte[4096];  
                while((bytesRead = bis.read(buffer,0,4096)) != -1){  
                    bos.write(buffer, 0, bytesRead);  
                }  
                bos.flush();  
                fis.close();  
                bis.close();  
                fos.close();  
                bos.close();  
                //return mapping.findForward("success");  
                  
                return null;  
            }catch(FileNotFoundException e){  
                e.printStackTrace();          
                return mapping.findForward("error");  
            }catch(Exception e){  
                e.printStackTrace();  
                return null;  
            }  
              
        }  



解释1   为什么要response.reset(); 假如这个方法是写在一个图片的链接上,如果不reset,就没办法多次下载,
不过对我来说现在没什么影响
解释2  对话框那块为什么只显示文件名    开始的时候我把整个路径都写进去了,结果倒也能下载,可使整个文件的路径都暴露了,跟直接用链接没什么区别了,所以一定要只写文件名


   以上3个方法都不能实现成功后转向成功页面的问题,在javaeye和csdn上询问也没有什么结果,不过我的确是见过类似的网页,不知道他们是怎么完成的?始终疑问阿。
   没有办法,只好考虑作个假的成功画面,用DispatchAction
   一个action1 ,实现转向成功页面功能 ,   一个action 2 ,实现下载功能
   工作流程为  点击链接, 甭管文件存在不存在,直接进入成功画面,在成功画面打开的同时,执行action2
Java代码 
<script type="text/javascript">  
  
 function download() {    
    window.location ="download.do?method=action2&filePath="+"<bean:write name="filePath" />";  
 }  
</script>  
</head>  
<body onload=download()>  


如果文件找不到,则成功画面会转向到失败画面,否则会留在成功画面并弹出对话框
分享到:
评论

相关推荐

    struts1 开源项目研究

    Struts1是一个经典的开源MVC框架,由Apache软件基金会维护,它在Java Web开发领域有着广泛的应用。这个项目的研究将帮助我们深入理解Web应用程序的架构设计,以及如何通过框架简化开发流程。 首先,Struts1的核心是...

    struts1下图片上传下载

    ### Struts1 下图片上传与下载技术解析 #### 一、引言 在Web开发中,文件上传与下载是一项常见的需求。Struts1框架作为Java Web应用开发中的一个重要工具,提供了丰富的功能支持来实现文件上传下载。本文将详细介绍...

    struts2资源下载,struts2资源下载

    在"struts2资源下载"中,我们可以获取到与Struts2相关的各种资料,包括但不限于教程、示例代码、API文档、安全补丁以及社区提供的插件等,这些都对学习和使用Struts2框架极其有益。 Struts2的核心功能包括: 1. **...

    Struts1工作原理浅析【转】

    1. 下载并安装 Struts1 框架。 2. 创建一个新的 Web 项目,并添加 Struts1 的 jar 文件。 3. 配置 struts-config.xml 文件,定义 ActionMapping 和其他配置信息。 4. 创建 Action 类,实现业务逻辑。 5. 创建 JSP ...

    struts的总结(struts1.x)

    ### Struts 1.x 总结 #### 一、Struts 框架概述 Struts 是一个基于 Java 的开源框架,它实现了 Model-View-Controller (MVC) 设计模式,帮助开发者构建可扩展、易于维护的 Web 应用程序。在 Struts 1.x 版本中,其...

    Struts 2.0

    在开始开发Struts 2应用之前,首先需要从Apache官方网站下载Struts 2的发行包,通常推荐下载all包,因为它包含了所有必要的文档、源码、实例和库文件。解压后,可以参考提供的示例程序进行学习,例如`struts2-blank-...

    struts2 最新版 不用去官网上下载了

    1. **Action和Result**: Struts2中的Action是业务逻辑的载体,它负责接收请求并处理,然后通过Result来决定如何展示结果。Result可以是JSP、FreeMarker模板或者其他视图技术。 2. **拦截器(Interceptors)**: 拦截器...

    struts2(1-7)源码 struts2学习入门 源码学习

    struts2 将要进行自定义类型转换的点数据从1个增加到3个 struts3 进行全局的类型转换 struts4 使用Struts2中内部类中的方法进行自定义类型转换,用到的类StrutsTypeConverter struts5 增加集合类型,使用范型 ...

    Struts2下载文件中文乱码处理

    ### Struts2下载文件中文乱码处理 在Web开发中,使用Struts2框架进行文件下载操作时,经常遇到的一个问题是文件名中的中文字符显示为乱码。这主要是因为浏览器和服务器之间的编码不一致所导致的。为了确保用户能够...

    struts2jar包

    1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的主要组件,如Action、Result、Interceptor等。它定义了请求处理的流程,提供了ActionContext、ValueStack等关键对象。 2. **xwork-core.jar**:XWork是...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    1. 创建一个类实现Converter接口,重写`convert`方法。在这个方法里,你可以编写自己的转换逻辑。 2. 在配置文件中注册这个转换器。在struts.xml文件中,使用`&lt;conversion&gt;`标签声明转换器,指定对应的转换类型。 ...

    基于Struts1.2的上传下载Demo

    本项目"基于Struts1.2的上传下载Demo"是针对该框架的一个实践示例,旨在帮助开发者理解和解决在Struts1.2环境中进行文件上传与下载的问题。 首先,让我们深入了解一下Struts1.2中的文件上传功能。在Struts1.2中,...

    struts2实现文件下载实例源代码

    在Struts2中实现文件下载的功能,可以帮助用户从服务器获取并保存文件到本地计算机,例如这里的"1.xls"文件。下面我们将深入探讨如何在Struts2框架下实现文件下载的实例。 首先,我们需要在项目的Web应用目录结构中...

    struts2上传下载项目

    在"struts2上传下载项目"中,我们可以深入理解如何利用Struts2实现文件的上传与下载功能。 首先,上传功能在Web应用中十分常见,比如用户在注册时上传头像,或者提交文档等。在Struts2中,我们主要借助`struts2-...

    Struts2 src 源码下载

    1. **StrutsPrepareAndExecuteFilter**:作为Servlet Filter,负责初始化Struts2环境并处理请求。 2. **ActionMapping**:映射HTTP请求到特定的Action。 3. **StrutsResult**和**Result**接口:定义了Action执行后的...

    struts2简单例子

    1. **MVC架构**: MVC模式是软件设计中的一个经典模式,它将应用逻辑分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Struts2中,模型负责业务逻辑,视图负责展示数据,而控制器接收用户...

    Struts2视频教程

    - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,支持拦截器、类型转换、文件上传等特性。Struts2使用过滤...

    Struts2 三种下载方法 源码(有图有真相)

    1. **超链接下载** 超链接下载是最直观且简单的下载方式,适用于小文件或非敏感文件。在Struts2中,可以通过创建一个Action,将文件路径作为Action的返回结果,然后在JSP页面上创建一个链接指向这个Action。用户点击...

    Struts1.x的登录示例

    Struts1.x是一个经典的Java Web框架,它在20世纪末至21世纪初被广泛使用,用于构建基于MVC(Model-View-Controller)架构的Web应用。本示例将探讨如何使用Struts1.x实现一个简单的登录功能。首先,我们需要理解...

Global site tag (gtag.js) - Google Analytics