上个星期,要做一个利用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** 配置文件多,包括struts-config.xml、web.xml等,配置繁琐。 - **Struts2.x** 配置文件较少,主要为struts.xml,支持注解配置,减少XML配置的繁琐。 8. **插件与扩展性**: - **Struts1.x** ...
3. **配置文件**:Struts1.x的配置主要分为两个部分:struts-config.xml和web.xml。struts-config.xml定义了Action的映射、Form Beans、数据源、以及其他的配置项。web.xml则配置了Struts Filter和Servlet。 4. **...
**三、Struts1.x文件下载** 1. **Action类**: 创建一个Action,根据文件路径读取文件内容并将其写入响应流。通常需要设置正确的响应头,如Content-Type和Content-Disposition。 ```java public class ...
- **手动搭建**:在 MyEclipse 中手动添加 Struts1.x 的相关依赖库,配置 web.xml 文件,并创建 struts-config.xml 文件来定义 Action 映射等配置。 - **IDE 工具支持**:利用 MyEclipse 或 Eclipse 等集成开发环境 ...
3. **配置文件**:主要包括struts-config.xml,这是Struts1.x的主配置文件,用于定义Action、ActionForm、ActionMapping等组件。在这里,你可以配置URL与Action类的映射,设置数据验证规则等。 4. **ActionForm**:...
Struts1.x提供了处理多文件上传的功能,使得开发者可以方便地集成到自己的应用程序中。 在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`...
在Struts1.x中,实现I18N(Internationalization)主要是通过资源文件(如*.properties)来管理不同语言的文本。这些文件按照语言和地区进行组织,例如,`message_en.properties`用于英文,`message_zh_...
Struts 1.x 是一个基于 Model-View-Controller (MVC) 设计模式的 Java Web 开发框架,由 Apache 软件基金会开发并维护。它在20世纪末到21世纪初广泛应用于企业级Web应用开发,因其强大的功能和良好的社区支持而受到...
1. **安装和配置**:了解如何在项目中集成Struts1.x框架,配置web.xml和struts-config.xml文件。 2. **Action和ActionForm**:深入理解这两者的作用,如何编写和使用它们。 3. **视图渲染**:熟悉JSP页面和Struts...
- 首先,你需要下载Struts1.x的库文件,如struts-1.3.10-all.zip,并将其解压缩。 - 在解压后的lib目录中,你可以找到所有必需的jar文件,包括Struts框架的实现和其他依赖。 - 创建一个新的Web项目,例如myStruts...
通过这个简单的Struts1.x登录示例,你可以了解Struts1.x的MVC工作流程、配置文件的编写以及Action和ActionForm的使用。然而,需要注意的是,Struts1.x已经较为过时,现代的Web开发更多地转向了Spring MVC、Play ...
Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)方面,Struts1提供了强大的支持,使得应用程序可以适应不同语言和地区的用户需求。以下是关于Struts1.x国际化...
在Struts 1.x中,如果需要在表单中处理文件上传,这个库是必不可少的。 搭建Struts 1.x环境的步骤通常包括以下几点: 1. 将这些jar包添加到你的项目类路径中。 2. 创建`struts-config.xml`配置文件,定义Action、...
**Struts2.x与Struts1.x对比**:相较于Struts1.x,Struts2.x具有更多的优势,如不再强制要求ActionForm,配置文件更简洁,处理流程更加清晰。具体而言,请求首先被过滤器捕获,然后根据`struts.xml`文件的配置调用...
7. **国际化和本地化**:Struts1.x支持多语言,通过资源文件实现不同地区的文本和日期格式。 8. **异常处理**:通过配置ExceptionMapping,可以全局地处理应用程序中抛出的异常,提高程序的健壮性。 9. **...
- struts-config.xml文件是Struts 1.x框架的核心配置文件,它定义了Action映射、Form Beans、Global Forwards以及其它配置信息。 - 文档中提到了struts-config.xml文件的默认内容,包括XML声明、文档类型声明和...
在Struts1.x中,实现文件上传功能是一个常见的需求,特别是在处理用户提交的表单时需要包含多个文件。下面我们将详细介绍如何使用Struts1.x来实现多个文件的上传。 首先,我们需要在HTML表单中添加`...
Struts1.x 提供了一系列的拦截器(Interceptor)和动作(Action)来处理用户请求,并通过配置文件(struts-config.xml)来定义这些请求的映射关系。在这个购物车系统中,Struts1.x 负责接收用户的HTTP请求,调用相应...
这个压缩包"struts2.x所有包及配置文件"包含了Struts2框架的核心组件、扩展和配置文件,用于构建和管理Java web应用。 1. **核心组件**: - `struts2-core.jar`:这是Struts2框架的基础,包含了Action、Result、...