Struts2文件上传(二) 深入FileUploadInterceptor
2009-09-18 00:00:00 来源:WEB开发网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 这三种参数。
更多精彩
赞助商链接