最近在使用 Struts2 + swfupload 做批量上传程序的时候,遇到了不少的问题,不过最终都被解决了,在这里记录一下,分享一下,也希望能帮助各位!
一. Action 中的 File 对象获取不到文件
出现这种情况一般是由于以下几种原因导制:
1. 没有配置文件上传的拦截器 (fileUpload) 导制的,这个拦截器是 Struts2 的内置拦截器。
<action name="photoUpload" class="photoAction" method="upload">
<interceptor-ref name="fileUpload" >
<param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
<param name="maximumSize">2048576</param>
</interceptor-ref>
</action>
像这种情况,通过后台打印的日志就可以看出来,没有配置 fileUpload 拦截器的情况下,上传的时候没有任务提示。
反之如果配置了,上传的时候后台会有如下提示信息(将log4j调到info 或者debug模式即可查看到) :
INFO Removing file upload D:\workshop\cookray\WebRoot\temp\upload__2437f199_13b8f96a11e__7ffd_00000002.tmp ==== http-80-Processor25: com.cookray.common.aop.FileUploadInterceptor.intercept(FileUploadInterceptor.java:126)
2. 有时候配置 fileUpload 的拦截器,发现 File 对象还是为空, 这是由于用户没有指定 params 的拦截器,这是一个封装表单数据的拦截器。
并且要记住,需要将 params 拦截器配在 fileUpload 的后面,它们的先后顺序是有影响,具体可以试一试。如下:
<action name="photoUpload" class="photoAction" method="upload">
<interceptor-ref name="fileUpload" >
</action>
<param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
<param name="maximumSize">2048576</param>
</interceptor-ref>
<interceptor-ref name="params" />
3. 后台日志提示上传的文件类型不被允许,如下:
ERROR Content-Type not allowed: upload "upload__1dac4906_13b8a76ec93__7ffd_00000006.tmp" application/octet-stream
这样我们只需要将提示的文件类型添加到 fileUpload 拦截器的配置里面即可, 有时候用户会发现,我们上传的文件明明是个 gif 的图片,而且我们也做了配置。
但是我们在上传的时候还是被提示? 为什么呢,原来我们在通过 swfupload 等一些客户端的插件上传的时候,插件使用了一种数据格式去上传这些文件。
例如:
application/octet-stream 、
application/x-shockwave-flash
二:不能清除struts2上传时生成的临时文件
我们在上传文件的时候,在临时文件夹(temp) 里面会生成一些 .tmp 的临时文件,上传成功后我们会发现一些临时文件没有被删除, 往往我们就会以为这些临时文件是由上传的文件(例如图片) 产生的,其实文件生成的临时文件已经被 fileUpload 拦截器删除了, 剩下的那些临时文件是其它内容产生的。
首先来说明一下这些临时文件都是什么内容? 其实这些临时文件包含了:
上传文件产生的临时文件(fileTmp) 和
提交的表单参数的临时文件(paramTmp), 其实 fileTemp 在上传结束的时候已经被 fileUpload 拦截器删除了,如果你看了 FileUploadInterceptor 的源代码就应该知道。 那剩下的那些 paramTmp 该怎样删除呢? 其实Struts2 已经提供了这样的一个拦截器。 我们打开 xwork-2.0.4.jar 包进入到
com.opensymphony.xwork2.interceptor 目录下可以看到,这里除了有一个
ParameterInterceptor 之外,还有一个
ParameterRemoverInterceptor 拦截器, 从字面上我们就应该可以看出这是一个删除参数的拦截器,配上它就可以了,如下:
<interceptor name="paramsRemove"
class="com.opensymphony.xwork2.interceptor.ParameterRemoverInterceptor" />
<action name="photoUpload" class="photoAction" method="upload">
<interceptor-ref name="fileUpload" >
<param name="allowedTypes">image/jpeg, image/jpg, image/gif</param>
<param name="maximumSize">2048576</param>
</interceptor-ref>
<interceptor-ref name="params" />
<interceptor-ref name="paramsRemove" />
</action>
暂到此!
整理背景:港交行[2012-12-11] 晚上 11:50