Struts2 文件上传大小限制

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大,否则没有过滤效果。



你可能感兴趣的:(String,struts,validation,upload,File,null)