前几天讲到struts文件上传,设置了fileUpload拦截器的参数以后,超过大小的文件被限制上传,但是类型不匹配的,却没有得到限制,今天有时间找了一下原因,发表一篇博文,请遇到问题的同学,参考一下:
在struts-default.xml中可以看到fileUpload的拦截器对应的类org.apache.struts2.interceptor.FileUploadInterceptor,查看源码会发现,类中的几个属性:
protected Long maximumSize; protected Set<String> allowedTypesSet = Collections.emptySet(); protected Set<String> allowedExtensionsSet = Collections.emptySet();
其中:maximumSize为允许上传的单个文件的大小
allowedTypesSet 为允许上传类型的集合
allowedExtensionsSet为允许上传的扩展名的集合
于是就有了我的错误配置:
<!-- 文件上传 Action --> <action name="fileup" class="cn.bdqn.action.FileUpAction"> <interceptor-ref name="fileUpload"><!-- 添加 文件上传 拦截器 设置 ,并添加参数 --> <param name="maximumSize">200000</param><!-- 单个文件大小 --> <param name="allowedExtensionsSet">html,txt</param><!-- 允许上传的文件扩展名 --> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref><!-- 添加 默认 拦截器栈设置 , --> <param name="savePath">/upload</param> <result>up_success.jsp</result> <result name="input">testUp.jsp</result> </action>
我按照拦截器中的属性配置了拦截器的三个参数,出现的错误结果就是:
超过大小的文件被限制上传,但是类型不匹配的,却没有得到限制
今天仔细看了一个源码里,有三个方法:
/** * Sets the allowed extensions * * @param allowedExtensions A comma-delimited list of extensions */ public void setAllowedExtensions(String allowedExtensions) { allowedExtensionsSet = TextParseUtil.commaDelimitedStringToSet(allowedExtensions); } /** * Sets the allowed mimetypes * * @param allowedTypes A comma-delimited list of types */ public void setAllowedTypes(String allowedTypes) { allowedTypesSet = TextParseUtil.commaDelimitedStringToSet(allowedTypes); } /** * Sets the maximum size of an uploaded file * * @param maximumSize The maximum size in bytes */ public void setMaximumSize(Long maximumSize) { this.maximumSize = maximumSize; }
于是,找到了错误,我们配置的拦截器的参数,应该根据set方法来,所以三个参数就应该是:maximumSize、allowedTypes和allowedExtensions
修改配置为:
<interceptor-ref name="fileUpload"><!-- 添加 文件上传 拦截器 设置 ,并添加参数 --> <param name="maximumSize">200000</param><!-- 单个文件大小 --> <param name="allowedExtensions">html,txt</param><!-- 允许上传的文件扩展名 --> </interceptor-ref>
测试,文件大小和扩展名的限制,成功!
时间: 2024-10-10 14:33:52