Struts2框架本身没有文件上传的功能模块,而是利用现在流行的几个文件上传开源框架,如Common-FileUpload和COS等。
Struts2利用拦截器将这些文件上传的框架巧妙的集成进来,不能不被称为一个优秀的拿来主义者。由于拦截器的使用,我们使用Struts2实现文件上
传变的非常容易,似乎什么也没发生,文件已经上传到服务器了,但如果仅仅是使用这个功能,可能永远不知道Struts2为你做了多少事情。最近有点闲,分
析了下下Struts2源码,才弄清楚其中的真相,笔记一下,以免遗忘。
Struts2利用request解析器来集成其他的文件上传
框架,Struts2提供了默认的request解析器
JakartaMultiPartRequest,在default.properties的struts.multipart.parser参数就是配
置request解析器,默认为jakarta也就是JakartaMultiPartRequest。当然,你也可以设置成cos,不过Struts2
没有提供适配cos的request解析器,你得自己实现,然后配置到自己的应用。JakartaMultiPartRequest也就是利用
Common-FileUpload来对request进行解析,然后保存解析结果。具体工作就是利用Common-FileUpload的
ServletFileUpload对request进行解析,得到所有的FileItem的list,然后对这个list进行分析。如果是文件上传表
单,则以表单的name属性分组,以表单name属性为key,对应的FileItem列表为Value保存到一个Map中。
JakartaMultiPartRequest的工作已经完成,当然,这个Map中保存的所有的FileItem,框架已经将文件保存到一个临时目录里
了,这个临时目录你也可以配置,参数为struts.multipart.saveDir,还要配置一个文件上传总大小,参数为
struts.multipart.maxSize。
接着就是FileUploadInterceptor的工作了,他的工作也非常简
单。首先进行验证,如文件上传大小限制,上传类型限制验证等。然后以表单名来构造三个参数,例如:你的文件上传表单name为upload,则这三个参数
为:upload,uploadContentType,uploadFileName。然后保存到ActionContext的PARAMETERS
中,当然如果表单很多,而且表单名又不同,他就会产生不同表单名对应的参数。最后系统的ParametersInterceptor拦截器会将
ActionContext的getParameters()得到的各个参数映射赋值给Action的各个属性,这就是为什么我们在开发文件上传的时候一
定要在Action中提供与表单名相同的File对象(如果一个表单名又多个上传文件,这是可以是File数组或是File的List),文件
名+ContentType,和文件名+FileName 这三种参数。
框架为我们所做的就是这些了,剩下的就是文件拷贝了。现在我们来注意下Action的这几个参数,其中File对象(当然也可能是数组或
List),这时他们已经指向系统临时目录里的某个文件,或是系统的内存里的数据了。在我们传输数据时,实际上是从这个临时文件或内存将数据库拷贝到上传
目录里去的,当执行完Action之后,FileUploadInterceptor会将临时目录里所有临时文件删除,这也是为什么上传文件完成后会有一
些日志显示说删除了一些临时文件的原因。
现在实现一个简单的文件上传,首先熟悉下几个参数配置:
1.struts.multipart.parser 配置request解析器,Struts2默认为jakarta 也就是JakartaMultiPartRequest,我们也 可以自己开发自己的解析器。
2.struts.multipart.saveDir
上传文件的临时保存目录,我们知道Common-FileUpload需要提供一个临时目录的。如果没有设置,则是
ServletContext.getAttribute("javax.servlet.context.tempdir")对应的目录,对应于
Common-FileUpoad中的repository参数。
3.struts.multipart.maxSize 这个是配置文件上传总大小,单位为B,默认大小为2097152b,对应于Common-FileUpload中的sizeMax参数。
在配置FileUploadInterceptor时候也有几个参数:
1.maximumSize 这是设置允许上传的单个文件的大小,如果某个文件大小大于这个大小,则会产生一个错误保存到Action中,错误的i18n的key为struts.messages.error.file.too.large
2.allowedTypesSet
这是设置允许上传文件的类型,多个类型以逗号“,”隔开,如果某个文件的类型没在这个设置之类,则会产生一个错误保存到Action中,错误的i18n的
的key为struts.messages.error.content.type.not.allowed
3.allowedExtensionsSet这是设置允许上传文件的后缀,多个类型以逗号“,”隔开,如果某个文件的后缀没在这个设置之类,则会
产生一个错误保存到Action中,错误的i18n的的key为
struts.messages.error.file.extension.not.allowed
struts.xml配置示例:
Xml代码
这里我们配置了fileUpload拦截器,我们还必须吧dufaultStack加上,由于defaultStack中已经包含了fileUpload拦截器,所以fileUpload拦截器会执行俩遍,所以我们会在日志信息中看到俩次清除临时文件的记录。
UploadAction:
Java代码
页面表单示例: Html代码
这样,一个简单的文件上传就实现了,但是感觉文件上传无声无息,特别上传大文件,等了很长时间才知道有没有上传成功,要是有上传进度条能及时显示上传进度,这样的文件上传的功能才能算完善了,上传进度条的功能下篇再写。
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Servlet来理解Struts2中的文件上传原理。Servlet是Java Web应用程序中的一个组件,用于处理HTTP请求和响应。而Struts2是一个基于MVC(模型-视图-控制器)设计模式的开源Web应用框架...
对于深入理解Struts2文件上传的工作原理,阅读源码是非常有帮助的。了解`FileUploadInterceptor`如何工作,以及`MultipartRequest`类如何解析Multipart请求,可以加深对整个过程的理解。 10. **实例实践** 博文...
在本篇文章中,我们将深入探讨Struts2中文件上传的工作原理、实现方法以及相关注意事项。 首先,我们来看一下Struts2文件上传的基本流程: 1. 用户通过HTML表单选择本地文件,并提交到服务器。 2. Struts2拦截器...
Struts2是一个流行的Java web框架,它为开发者提供了一种模型-视图-控制器(MVC)架构,便于构建可维护、可扩展的Web应用程序。文件上传是许多Web应用...这对于我们深入理解Struts2框架和优化文件上传功能非常有帮助。
在处理用户交互,特别是文件上传时,Struts2提供了一种便捷的方式。然而,文件上传功能也涉及到一个重要的问题,那就是大小限制。在实际应用中,为了防止恶意用户上传大文件导致服务器资源耗尽,或者保护服务器免受...
在这个场景中,我们将深入探讨Struts2如何实现文件上传,以及涉及到的关键知识点。 首先,我们需要了解Struts2的配置。在Struts2中,我们通常会在struts.xml配置文件中定义一个Action,这个Action将处理文件上传...
2. **配置Action**:在Struts2的Action类中,需要创建一个字段与上传文件对应,通常使用`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器处理文件上传。你需要在`struts.xml`配置文件中包含这个拦截器...
下面我们将深入探讨Struts2文件上传的相关知识点。 1. **Struts2配置**: 在Struts2中进行文件上传,首先需要在struts.xml配置文件中启用上传插件。添加以下配置以启用`struts2-convention-plugin`和`struts2-file...
在本篇文章中,我们将深入探讨如何利用Struts2实现批量文件上传,以及涉及的相关技术与最佳实践。 首先,我们需要了解Struts2的核心概念——`Interceptor(拦截器)`,这是Struts2处理请求的核心组件,用于在Action...
在"struts2.1.3上传文件"这个主题中,我们将深入探讨Struts2如何实现文件上传功能,以及与之相关的jsp(JavaServer Pages)技术。 文件上传是Web应用程序中常见的需求,例如用户可能需要上传照片、文档或其他类型的...
在这个"Struts2文件上传教程"中,我们将深入探讨如何在Struts2环境中实现文件上传功能。 文件上传在web应用中很常见,例如用户可能需要上传头像、提交文档或分享图片。在Struts2中,这个过程涉及到几个关键组件和...
Struts2 提供的 `org.apache.struts2.interceptor.FileUploadInterceptor` 拦截器和 `org.apache.struts2.components.File` 组件使得文件上传变得简单。同时,可以结合其他工具或库,如Apache Commons FileUpload,...
在Struts2中,我们可以利用`Struts2`的`FileUpload interceptor`来处理文件上传。这个拦截器能够解析请求中的文件内容,并将其转换为`Action`类中的属性。在`Action`类中,我们可以定义一个或多个`File`类型的字段,...