Struts2框架实现文件上传
开发环境
系统:Windows10 版本1709
JDK:1.8.0_161 32位
IDE: Spring Tool Suite 3.7.3 32位
Struts2版本:2.3.24
服务器版本:apache-tomcat-7.0.52
单文件的上传
环境搭建
导入必要的jar包
必须有commons-fileupload-1.3.1.jar包. 在开发Struts2框架必备的13个jar包中,包含了此jar包.
在web.xml中配置核心的过滤器
在src目录下创建struts.xml文件,并导入约束
文件上传的浏览器的三要素
表单的提交方式必须为post
表单中必须有一个
表单设置enctype="multipart/form-data"
创建一个upload.jsp页面
文件上传的服务器端
创建一个UploadAction的java类
在struts.xml中进行如下的配置
使用Struts2框架实现文件上传.在页面的name属性的名字,必须与文件上传的Java类中定义的File类型变量的名字一样.
文件类型和文件名称的变量名也必须为name之后的拼接
注意上传的文件是个临时文件,服务器重启后,文件就不存在了. 要想永久的保存,需要指定一个本地硬盘的目录.
文件上传出现的问题以及解决方案
文件的大小问题
如果上传一个较大的文件,控制台会报空指针异常.这个空指针的异常信息不够详细.
把当前的文件上传的java类继承ActionSupport类底层会去调用保存错误信息的方法. 并且在struts.xml文件中,开启开发者模式.
再次上传一个较大的文件,会发现这次在报的错误不再是空指针异常. 控制台报错信息如下:
这是说当前的文件上传的java类没有配置result 的input视图.
这是因为Struts底层的拦截器如果出现问题,那么就会把错误信息存储到action中, workflow的拦截器负责控制跳转到指定的input视图.
在struts.xml中的\标签中配置\名为input的视图 ,标签体为error.jsp
在WebContent下新建一个error.jsp页面
在jsp页面的顶部导入struts2框架的标签
在页面中写上struts的标签 用来显示提示错误信息
以上的操作做完了之后, 再次上传一个较大的文件.会在浏览器上看到如下的错误提示信息
提示是说,请求超出了最大的允许界限
原因是在struts2框架default.properties配置文件中,定义了默认的文件上传大小为2097152字节(byte)为2M.
在struts.xml的配置文件中,修改这个常量的大小.
修改为20M. 再次上传一个小于20M的文件后,就不会报错了. 这个文件大小的范围,依据实际的需求而设定.
以上的改变常量方法是对所有的action生效,要想仅仅使一个action生效,设置上传文件的大小,需要在标签中设置
查看FileUploadInterceptor这个拦截器的源码
发现有如下的属性:
分别代表的是设置文件的最大大小,设置运行的文件类型,设置文件运行的后缀名.
有如下的set方法,设置参数.
上传文件允许的后缀名
在如下的struts.xml中,配置如下:
设置了只允许上传后缀名为avi,txt结尾的文件
实验上传一个.doc后缀名的文件
浏览器上会有如下的报错信息 :提示了doc后缀名是不允许的.
多文件的上传
新建一个multipload.jsp的页面
设置了三个文件上传框
新建一个MultiUploadAction
在原来的属性中,把FIle设置为List集合,或者是数组.
以下为设置了数组.遍历每一个数组的元素.通过索引获取数组的文件名和文件.
以下是List集合的方式
通过list.size()来控制集合的遍历,通过get(index)来获取集合的每一个元素
在配置文件中新建一个action的配置
多文件上传的测试
在服务器中部署项目,访问multipload.jsp页面
选择三个小于2M的文件进行选择文件上传测试.点击上传后,成功在服务器的upload文件夹下上传了文件
注解开发
注解配置文件上传
注解的方式配置action类 单个的文件上传
在class 上配置namespace 和parentPackage
注意单文件的上传@ParentPackage的值为"upload_demo",因为在struts.xml设置了拦截器,起了包名为"upload_demo"
在方法上配置@Action @InterceptorRef @Result
注解的方式的配置多文件的上传
```
struts.xml中的内容如下
总结
相比较于使用单纯的javaweb开发FileUpload来实现文件上传,使用Struts2框架的文件上传更加的简洁方便,相关的文件上传的控制也更加的方便.但需要对Struts2框架有所熟悉,才能灵活的运用Strust2的文件上传功能.
领取专属 10元无门槛券
私享最新 技术干货