`
fighter1945
  • 浏览: 230773 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts1.x文件下载

阅读更多

上个星期,要做一个利用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方法的最后却被注明

 

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

 

 

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

 

 

方法2 以前单独在jsp中,这种方法可能挺流行的,不过在action中一样行不通。 例如代码

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;
			}

}
 

     解释1  为什么成功后return null   因为前面response 已经提交过,没办法再forward,否则报错

     解释2  为什么FileNotFoundException转到error画面,因为对话框中,用户如果点取消按钮,tomcat会报ClientAbortException

假如连这个exception都抓掉,然后进行forward,一样会报response已经提交过的错误,根本无法转向。所以干脆就留

着它好了。

     方法1  其实根方法3一样,输入流,输出流,有兴趣地可以用IOUtils.copy(in, response.getOutputStream()); 

 没兴趣的可以参照以下代码,我也是参考论坛上一位兄弟的

 

   		

 

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

<script type="text/javascript">

 function download() { 	
	window.location ="download.do?method=action2&filePath="+"<bean:write name="filePath" />";
 }
</script>
</head>
<body onload=download()>

 

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

 

 

 

分享到:
评论

相关推荐

    对struts1.x与struts2.x的区别的总结

    - **Struts1.x** 配置文件多,包括struts-config.xml、web.xml等,配置繁琐。 - **Struts2.x** 配置文件较少,主要为struts.xml,支持注解配置,减少XML配置的繁琐。 8. **插件与扩展性**: - **Struts1.x** ...

    Struts1.x常用的开发包,需要学习struts1.x朋友可以下载

    3. **配置文件**:Struts1.x的配置主要分为两个部分:struts-config.xml和web.xml。struts-config.xml定义了Action的映射、Form Beans、数据源、以及其他的配置项。web.xml则配置了Struts Filter和Servlet。 4. **...

    struts1.x 上传下载

    **三、Struts1.x文件下载** 1. **Action类**: 创建一个Action,根据文件路径读取文件内容并将其写入响应流。通常需要设置正确的响应头,如Content-Type和Content-Disposition。 ```java public class ...

    struts1.x技术课程讲解.pdf

    - **手动搭建**:在 MyEclipse 中手动添加 Struts1.x 的相关依赖库,配置 web.xml 文件,并创建 struts-config.xml 文件来定义 Action 映射等配置。 - **IDE 工具支持**:利用 MyEclipse 或 Eclipse 等集成开发环境 ...

    Struts1.x系列教程(网摘-全)

    3. **配置文件**:主要包括struts-config.xml,这是Struts1.x的主配置文件,用于定义Action、ActionForm、ActionMapping等组件。在这里,你可以配置URL与Action类的映射,设置数据验证规则等。 4. **ActionForm**:...

    struts1.x多文件上传

    Struts1.x提供了处理多文件上传的功能,使得开发者可以方便地集成到自己的应用程序中。 在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`...

    Struts1.x_Project.zip

    在Struts1.x中,实现I18N(Internationalization)主要是通过资源文件(如*.properties)来管理不同语言的文本。这些文件按照语言和地区进行组织,例如,`message_en.properties`用于英文,`message_zh_...

    java Struts 1.x 框架 Web 开发

    Struts 1.x 是一个基于 Model-View-Controller (MVC) 设计模式的 Java Web 开发框架,由 Apache 软件基金会开发并维护。它在20世纪末到21世纪初广泛应用于企业级Web应用开发,因其强大的功能和良好的社区支持而受到...

    struts1.x apps 所有最新的Struts1.x项目应用

    1. **安装和配置**:了解如何在项目中集成Struts1.x框架,配置web.xml和struts-config.xml文件。 2. **Action和ActionForm**:深入理解这两者的作用,如何编写和使用它们。 3. **视图渲染**:熟悉JSP页面和Struts...

    struts1.x入门教程

    - 首先,你需要下载Struts1.x的库文件,如struts-1.3.10-all.zip,并将其解压缩。 - 在解压后的lib目录中,你可以找到所有必需的jar文件,包括Struts框架的实现和其他依赖。 - 创建一个新的Web项目,例如myStruts...

    Struts1.x的登录示例

    通过这个简单的Struts1.x登录示例,你可以了解Struts1.x的MVC工作流程、配置文件的编写以及Action和ActionForm的使用。然而,需要注意的是,Struts1.x已经较为过时,现代的Web开发更多地转向了Spring MVC、Play ...

    struts1.x 最简洁国际化 源代码

    Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)方面,Struts1提供了强大的支持,使得应用程序可以适应不同语言和地区的用户需求。以下是关于Struts1.x国际化...

    搭建struts1.x的jar包

    在Struts 1.x中,如果需要在表单中处理文件上传,这个库是必不可少的。 搭建Struts 1.x环境的步骤通常包括以下几点: 1. 将这些jar包添加到你的项目类路径中。 2. 创建`struts-config.xml`配置文件,定义Action、...

    魔乐科技Struts2.x框架笔记

    **Struts2.x与Struts1.x对比**:相较于Struts1.x,Struts2.x具有更多的优势,如不再强制要求ActionForm,配置文件更简洁,处理流程更加清晰。具体而言,请求首先被过滤器捕获,然后根据`struts.xml`文件的配置调用...

    Struts1.x 中文帮助文档

    7. **国际化和本地化**:Struts1.x支持多语言,通过资源文件实现不同地区的文本和日期格式。 8. **异常处理**:通过配置ExceptionMapping,可以全局地处理应用程序中抛出的异常,提高程序的健壮性。 9. **...

    Struts1.x入门与提高系列教程.pdf

    - struts-config.xml文件是Struts 1.x框架的核心配置文件,它定义了Action映射、Form Beans、Global Forwards以及其它配置信息。 - 文档中提到了struts-config.xml文件的默认内容,包括XML声明、文档类型声明和...

    使用struts1.x上传多个文件的一中方法

    在Struts1.x中,实现文件上传功能是一个常见的需求,特别是在处理用户提交的表单时需要包含多个文件。下面我们将详细介绍如何使用Struts1.x来实现多个文件的上传。 首先,我们需要在HTML表单中添加`...

    Struts1.x在线购物车系统,Hibernate,Mysql

    Struts1.x 提供了一系列的拦截器(Interceptor)和动作(Action)来处理用户请求,并通过配置文件(struts-config.xml)来定义这些请求的映射关系。在这个购物车系统中,Struts1.x 负责接收用户的HTTP请求,调用相应...

    struts2.x所有包及配置文件

    这个压缩包"struts2.x所有包及配置文件"包含了Struts2框架的核心组件、扩展和配置文件,用于构建和管理Java web应用。 1. **核心组件**: - `struts2-core.jar`:这是Struts2框架的基础,包含了Action、Result、...

Global site tag (gtag.js) - Google Analytics