`

Struts2文件上传(二) 深入FileUploadInterceptor

阅读更多

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代码 

这样,一个简单的文件上传就实现了,但是感觉文件上传无声无息,特别上传大文件,等了很长时间才知道有没有上传成功,要是有上传进度条能及时显示上传进度,这样的文件上传的功能才能算完善了,上传进度条的功能下篇再写。

分享到:
评论

相关推荐

    Java框架篇-struts之文件上传和下载

     在Struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.interceptor.FileUploadInterceptor类的defaultStack中的一部分。仍然可以使用在struts.xml中设置各种参数,我们将在下

    SCN

    修改: package com.opensymphony.webwork.interceptor.FileUploadInterceptor 类line88 to line 93 修复bug:upload empty file cause nullponit exception 博文链接:...

    webwork-2.1.7.jar

    修改: package com.opensymphony.webwork.interceptor.FileUploadInterceptor 类line88 to line 93 修复bug:upload empty file cause nullponit exception 博文链接:...

    grpcio-1.45.0-cp37-cp37m-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    AVee基础教程.pdf

    AVee基础教程

    mysql语句大全及用法

    mysql语句大全及用法

    cryptography-42.0.1-cp37-abi3-musllinux_1_1_aarch64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    debugpy-1.4.0-cp38-cp38-manylinux1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于springboot的师生共评的作业管理系统源码数据库.rar

    计算机专业毕业设计之springboot论文资源

    debugpy-1.4.0-cp39-cp39-manylinux2014_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    scratch2源码算法练习-用逗号分隔列表

    scratch2源码算法练习-用逗号分隔列表提取方式是百度网盘分享地址

    Lab3_1_23151102.exe

    Lab3_1_23151102.exe

    scratch2源码捡贝壳(仿)

    scratch2源码捡贝壳(仿)提取方式是百度网盘分享地址

    vuInhub靶场实战系列-DC-6实战

    vuInhub靶场实战系列-DC-6实战

    debugpy-1.0.0b10-cp36-cp36m-macosx_10_14_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    scratch2源码饥饿鲨

    scratch2源码饥饿鲨提取方式是百度网盘分享地址

    3位单排数码管控制过程详解

    相关控制功能函数C文件和相应的h文件

    cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    debugpy-1.0.0b5-cp36-cp36m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics