Struts2 上传和下载文件(二)
二、 Struts 2 的文件上传
?Struts 2 并未提供自己的请求解析器,它需要调用其他上传框架来解析二进制请求数据。但 Struts 2 在原有的上传解析器基础上做了进一步封装,简化了文件上传
?
2.1 Struts 2的文件上传支持
?
在 Struts 2 的 struts.properties 配置文件中,可以看到上传文件解析器
UploadAction.java
?xxx, xxxFileName ,xxxContentType,这个3个属性,可以更简单地实现文件上传。
?
savePath 属性,通过配置文件来设置,从而允许动态设置该属性值(依赖注入)
?
提示:Struts 2 的 Action 中的属性,功能非常丰富,除了可以用于封装 HTTP 请求参数外,也可以封装 Action 的处理结果。不仅如此,Action 属性还可以通过在 Struts 2 配置文件中进行配置,接收 Struts 2 框架的注入,允许在配置文件中为该属性动态指定值。
?
?
2.3 配置文件上传的 Action
?
struts.xml
?
?以上2段代码与 2.2 中一起使用
?
?
2.4 手动实现文件过滤
?
限制浏览者自由上传各种文件,或限制上传文件大小等等,可以使用文件过滤
?
手动实现文件过滤的步骤:
① 在 Action 中定义一个专门用于进行文件过滤的方法,方法名是任意的,该方法的逻辑就是判断上传文件的类型是否为允许的类型,如下 filterType() 方法
?
??
为了让文件上传类型校验失败时能返回 input 逻辑视图,在 struts.xml 中加入 input :
?错误提示 <span style="color:red">${requestScope.typeError}</span>
?
?
提示: 如果需要实现文件大小过滤,可以调用 File 类 的 length() 方法来获取上传文件大小。除此之外,Struts 2 的 struts.multipart.maxSize 常量也用于限制允许上传的文件大小,这个常量对于整个 Struts 2 应用都会起作用
?
?
?
?
2.5 拦截器实现文件过滤
?
Struts 2 提供一个文件上传的拦截器,通过配置拦截器可以更轻松实现文件过滤。Struts 2 中文件上传的过滤器是 fileUpload 为了让该拦截器起作用,只需要在该 Action 中配置该拦截器引用即可。
?
配置 fileUpload 拦截器时,可以指定 2 个参数:
?
??? ● allowedTypes : 指定允许上传的文件类型,多个文件类型之间用英文逗号(,)隔开
● maximumSize : 指定允许上传的文件大小,单位是字节
?
通过配置 fileUpload 拦截器,可以轻松地实现文件过滤,过滤失败后,自动转入 input 逻辑视图
在 Action 配置 input,还有 defaultStack 的拦截器引用:
?
struts.xml
?
??上面的代码将会把文件过滤失败的信息显示在该页面上,给用户重新上传生成提示。
?
国际化
?
默认是英文提示,需要国际化
● 上传文件太大的提示信息的 key 是 "struts.messages.error.file.too.large" , 如果在自己的国际化资源文件中增加该 key 的消息,将可改变该提示信息。
● 不允许上传的文件类型的提示信息的 key 是 "struts.messages.error.content.type.not.allowed" 的信息;如果在自己国际化资源文件中增加该 key 的消息,将可改变文件类型不允许的提示信息
●? 文件上传的未知错误的key 为 "struts.messages.error.uploading" 的信息,如果用户上传文件失败,既不是文件类型不允许,也不是文件大小超出允许大小,则系统将提示页面输出该 key 的消息
?
globalMessages.properties
?
??
?
2.7 文件上传的常量配置
?
当每次上传文件时,都可以在 Tomcat 的控制台看见如下信息:
?
struts.xml
?除此之外,我们还应该将 Pell 的核心 JAR 包复制过来,multipartrequest.jar
?
至于文件上传的 Action ,配置 Action , 过滤文件类型等,与使用 Common-FileUpload 进行文件上传完全相同
?