struts2上传文件在用的过程中总有些问题:
1. 总找不到'input'逻辑视图,当在action用拦截器的时候(类型、拦截)且配置逻辑视图‘input’后,仍然没有走'input‘.
假设一下:如果大小超过maximumSize的值或类型不在allowedTypes值的范围内的时候,应该由触发器返回input逻辑视图到struts.xml中。如果没有让action集成 actionsuppt的话,拦截器不会返回'input‘。那么请求就会进入action中并且所谓的拦截器起不到任何效果,文件将会上传成功!
2.当上传文件的大小超过 <constant name="struts.multipart.maxSize" value="9000000"/>它设置的大小时会爆这个错误
‘警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8782125) exceeds the configured maximum (2097152)’。
这个时候如果action集成actionsupport也会返回'input',进入设定好的页面。即时没有配置拦截器interceptor-ref,由此可见,action默认是执行defaultStack的interceptor-ref拦截器。只要继承actionsupport默认的拦截器就会返回'input'。
3.拦截器的配置: 有时候发现拦截器无效:
<interceptor-ref name="fileUpload" >
<param name="allowedTypes">image/jpg,image/pjpeg,image/gif</param>
<param name="maximumSize">100000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
即时这样配置了,仍然起不到拦截的作用,除去没有继承actionsupport导致没有范围'input'的情况外,还有可能就是拦截器配置错误,比如 allowedTypes、maximumSize 写错,或者 没有写defaultStack默认拦截器。
4. 当拦截器返回由于上传失败被拦截而返回的 'input'时,如果struts.xml中没有进行配置逻辑视图'input'会出现
这个是weblogic下出现的情况,在tomcat下出现的是No ‘No result defined for Action and result 'input' ’,而且如果对 此action进行 单实例或者多实例限制,单实例此action将不再能用除非重启容器服务重新实例此action,多实例将不会出现这种情况。默认情况下是多实例
5. <constant name="struts.multipart.maxSize" value="9000000"/>和拦截器参数<param name="maximumSize">100000</param>的区别?
<constant name="struts.multipart.maxSize" value="9000000"/>它负责设置框架文件拦截大小,而<param name="maximumSize">100000</param>只针对当前的action。并且他们报的错不一样。
<constant name="struts.multipart.maxSize" value="9000000"/> 它报:
‘警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8782125) exceeds the configured maximum (2097152)’。
<param name="maximumSize">100000</param> 而它报:警告: File too large: upload "DSC05128.JPG" "upload_3bcea337_138232bd3xxx“
它们共同的特点是 在继承actionsupport的情况下都返回input