struts2 上传框架有COS,pell,Common-FileUpload等几种,可以通过配置struts.properties中配置,如下:
struts.multipart.parser=cos
struts.multipart.parser=pell
struts.multipart.parser=jakarta //Struts 2 默认使用Jakarta的Common-FileUpload的文件上传解析器
在struts2 自带的文件default.properties中设置的(系统默认大小2M)
struts.multipart.maxSize=2097152
这个可以在struts.propertise 文件中修改
Struts2 先通过Common-FileUpload文件上传解析器来对文件大小过滤,
Common-FileUpload包的FileUploadBase.class中parseRequest方法中进行了大小限制,其中代码如下:
if (sizeMax >= 0 && requestSize > sizeMax) { throw new SizeLimitExceededException( "the request was rejected because its size (" + requestSize + ") exceeds the configured maximum (" + sizeMax + ")", requestSize, sizeMax); }
这里的sizeMax就是struts.multipart.maxSize的值。在上传文件之前系统会去比较文件的大小是否超过了该值,如果超过将抛
出上述异常,commons-fileupload组件是不支持国际化的,所以我们看到的异常都是默认的。
然后会进入struts2核心库里的org.apache.struts2.intercepto.FileUploadInterceptor中对大小进行拦截。这个大小值在struts.xml中配置,如下:
<interceptor-ref name="fileUpload"> <param name="maximumSize">409600</param> 单个上传文件最大不能超过400K <param name="allowedTypes">...</param> mime类型,多个用逗号分开 </interceptor-ref> ** 加入默认的拦截器 <interceptor-ref name="defaultStack" />FileUploadInterceptor.class中过滤代码如下:
/** * Override for added functionality. Checks if the proposed file is acceptable based on contentType and size. * * @param file - proposed upload file. * @param contentType - contentType of the file. * @param inputName - inputName of the file. * @param validation - Non-null ValidationAware if the action implements ValidationAware, allowing for better * logging. * @param locale * @return true if the proposed file is acceptable by contentType and size. */ protected boolean acceptFile(File file, String contentType, String inputName, ValidationAware validation, Locale locale) { boolean fileIsAcceptable = false; // If it's null the upload failed if (file == null) { String errMsg = getTextMessage("struts.messages.error.uploading", new Object[]{inputName}, locale); if (validation != null) { validation.addFieldError(inputName, errMsg); } log.error(errMsg); } else if (maximumSize != null && maximumSize.longValue() < file.length()) { String errMsg = getTextMessage("struts.messages.error.file.too.large", new Object[]{inputName, file.getName(), "" + file.length()}, locale); if (validation != null) { validation.addFieldError(inputName, errMsg); } log.error(errMsg); } else if ((! allowedTypesSet.isEmpty()) && (!containsItem(allowedTypesSet, contentType))) { String errMsg = getTextMessage("struts.messages.error.content.type.not.allowed", new Object[]{inputName, file.getName(), contentType}, locale); if (validation != null) { validation.addFieldError(inputName, errMsg); } log.error(errMsg); } else { fileIsAcceptable = true; } return fileIsAcceptable; }这里的maximumSize指的是Struts.xml中的maximumSize,如果没有配置,值为null。
fileUpload拦截器只是当文件上传到服务器上之后,才进行的文件类型和大小判断。 如果上传的文件大小刚好这struts.multipart.maxSize与maximumSize 之
间会抛出 key为struts.messages.error.file.too.large 对应的异常信息。
注意:maximumSize不能比struts.multipart.maxSize大,否则没有过滤效果。