手工处理 Struts2 框架上传的文件
在使用了 Struts2 框架的系统中,对于处理像下面这种表单上传文件时:
view source
print?
1.<form action="..." enctype="multipart/form-data">
2. 文件:<input type="file" name="upload"><br>
3. 描述:<input type="text" name="desc"></br>
4. <input type="submit" value="提交">
5.</form>
自然而然的想法就是在 Action 中声明变量 File upload 和 String desc,请求提交到这个 Action 后,在 execute() 方法中就能直接使用 upload 和 desc 了,它们已被 Struts2 框架(org.apache.struts2.interceptor.FileUploadInterceptor 监听器) 赋上了相应的值了。
因为维护的是一个古老的项目,请求都是直接提交给 jsp。在这个项目中套上了 Struts2 已是不易了。原来项目是用的 jspSmartUpload 来处理上传文件的,Struts2 一上 jspSmartUpload 便不能正常工作了,因为 Struts2 的过滤器 org.apache.struts2.dispatcher.FilterDispatcher 拦截的是所有的请求,在交把请求交给 jspSmartUpload 之前请求 request 就已被处理过了,即使是把 struts2-core-2.x.x.jar 中的 struts-default.xml fileUpload 取消了也是如此。
暂时又不想再新加一个 Action,声明 upload:File 和 desc:String 直接接收参数,这样改动的话实在是大,现在 struts.xml 和 struts.properties 文件还是空的呢。所以姑且在原来那个 jsp 中处理吧。
最早做过 jsp 文件上传的人都知道,给 form 加上 enctype="multipart/form-data" 属性后,request.getParameter("desc") 取输入框的值就失灵了,因为页面请求数据是以流的形式发送给服务器的,所以 jspSmartUpload 用了它自己的 Request, com.jspsmart.upload.SmartUpload.getRequest().getParameter("desc") 来接收文本框数据,但对于 Struts2 处理过的 request jspSmartUpload 就无能为力了。
那么在 Struts2 中的 jsp 如何获取到 enctype="multipart/form-data" 表单传递过来的文本输入和文件呢?
·获取文本框的值 ,仍然可用 request.getParameter("desc"),因为此时的 request 是由 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper 实现的。
对比一下不同时候 request 的具体实现类(Tomcat 环境中)
form enctype multipart/form-data application/x-www-form-urlencoded
Struts2 org.apache.struts2.dispatcher.multipart
.MultiPartRequestWrapper org.apache.struts2.dispatcher
.StrutsRequestWrapper
Struts1 org.apache.struts.upload
.MultipartRequestWrapper org.apache.coyote.tomcat5
.CoyoteRequestFacade
无框架 org.apache.coyote.tomcat5
.CoyoteRequestFacade org.apache.coyote.tomcat5
.CoyoteRequestFacade
·获取上传来的文件 用就要对 request 作个转型,才能调用到相应的方法
view source
print?
1.MultiPartRequestWrapper mpRequest = (MultiPartRequestWrapper)request;
2.
3.File[] files = mpRequest.getFiles("upload"); //文件现在还在临时目录中
4.String[] fileNames = mpRequest.getFileNames("upload");
5.
6.//然后就可以处理你的业务了
其他方法可以查看 MultiPartRequestWrapper API,MultiPartRequestWrapper 是继承自 org.apache.struts2.dispatcher.StrutsRequestWrapper 的。
最后,用了 Struts2 来上传文件,最好在 web.xml 中加上 ActionContextCleanUp 过滤器以避免一些未不预知的异常。
view source
print?
01.<filter>
02. <filter-name>struts-cleanup</filter-name>
03. <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
04.</filter>
05.
06.<filter-mapping>
07. <filter-name>struts-cleanup</filter-name>
08. <url-pattern>/*</url-pattern>
09.</filter-mapping>
网上有人说是要加 ActionContextCleanUp 过滤器的,ActionContextCleanUp 的代码注释是它易于同 SiteMesh 的整合,至于为何与文件上传扯上关系,我以后也会关注的。
对了还要在项目中引入 commons-fileupload-x.x.x.jar 和 commons-io-x.x.jar 包,其他没有什么特别的配置,默认即可。相信本文的实用性不强,不会有人用 jsp 来处理这些事情,参考价值可能还有一些。
分享到:
相关推荐
Struts2框架是Java Web开发中的一个流行MVC(Model-View-Controller)框架,它提供了丰富的功能,包括处理表单提交、文件上传等。在Struts2中,文件上传是一个常见的需求,可以帮助用户从客户端上传文件到服务器。...
Struts2框架是Java Web开发中的一个流行MVC(Model-View-Controller)框架,它提供了许多便利的功能,包括文件上传。在Struts2中实现文件上传,可以帮助开发者处理用户从浏览器端上传的文件,例如图片、文档等。以下...
在Struts框架中,文件上传和下载是常见的功能需求,尤其在处理用户数据交互时。 一、文件上传 1. Struts1中的文件上传:在Struts1中,文件上传主要依赖于`commons-fileupload`和`commons-io`两个库。首先需要在`...
在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...
### Struts2框架整合Spring框架在文件上传下载中的应用 #### 一、引言 随着互联网技术的迅速发展,Web应用程序的功能越来越丰富,文件的上传下载功能已成为许多Web应用不可或缺的一部分。例如,在博客、电子邮件...
本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...
1. **文件上传**:用户登录后,可以使用系统提供的上传功能选择本地的文件,Struts框架通过Servlet API中的Part接口处理文件流,将文件从客户端传输到服务器的指定目录。此过程需要对文件大小、类型进行限制,以防止...
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
6. **Plug-in(插件)**:Struts2允许通过插件扩展其功能,比如,国际化、文件上传、日期时间处理等。这些插件可以方便地集成到项目中,增强应用的功能。 7. **Freemarker或Velocity模板**:Struts2支持使用...
综上所述,Struts2文件上传下载和表单重复提交涉及多个技术点,包括Struts2的配置、文件操作、HTTP响应头设置、安全性和异常处理。理解并熟练掌握这些知识点,对于构建健壮的Web应用程序至关重要。
在表单中,你可以使用`<s:file>`标签来创建一个文件输入控件,然后提交表单时,Struts2会处理文件的上传。 文件下载则涉及到将服务器上的文件以二进制流的形式发送到客户端。在Struts2中,你可以在Action类中定义一...
在这个“Struts框架文件上传下载案例”中,我们将探讨如何在Struts2框架下实现文件的上传和下载功能,这对于Web应用来说是非常常见的需求。 文件上传功能是Web应用中允许用户从本地计算机选择文件并将其传输到...
3. **创建Struts2 Action**:在Struts2框架中,创建一个处理文件上传的Action类,该类通常会包含一个`List<HttpServletFileWrapper>`类型的属性,用于接收上传的文件。 4. **编写Struts2配置**:在struts.xml配置...
这个"Struts2+上传文件源码"是一个演示如何在Struts2框架下实现文件上传的示例代码。 首先,我们来理解上传文件的基本流程。在Struts2中,文件上传是通过`Commons FileUpload`库来处理的,这是一个Apache提供的开源...
2. **上传组件**:Struts2使用Apache Commons FileUpload库来处理文件上传。这个库负责解析请求中的多部分数据,将文件内容分离出来。`commons-fileupload.jar` 是这个库的实现,它包含了处理文件上传的基本类和接口...
在Struts框架中,文件上传主要依赖于两个关键组件:`Commons FileUpload`库和`Struts2上传插件`。`Commons FileUpload`是Apache的一个子项目,负责处理HTTP请求中的多部分数据,而Struts2上传插件则整合了这一库,...
通过学习这个例子,开发者可以了解到Struts2处理文件上传的基本流程,为自己的项目提供参考。在实际开发中,我们还需要考虑到安全性问题,如防止文件覆盖、非法文件上传等,确保系统的稳定性和安全性。
1. **.struts2配置**:在Struts2框架中,需要在`struts.xml`配置文件中添加相应的action配置,声明文件上传的处理方法。通常,你需要设置`<result>`类型为`stream`,以便处理上传的文件。 2. **Action类**:创建一...
Struts2、jQuery和Ajax是Web开发中的三个关键组件,它们共同构成了文件异步上传的基础框架。这个项目是在MyEclipse环境下实现的一个简单的文件上传功能,让我们深入了解一下这些技术及其在文件上传中的应用。 首先...
最近自学java中的框架-struts写了一些小例子,这都是很经典的程序,如果大家瞧得起要下载去看看,顺便给俺找找不足的地方。我的qq 821865130 email qingtian_hechen@163.com 希望大家能多多给我帮助。在此谢谢各位!...