根据控制器更改文件大小限制 (maxUploadSize)

2022-01-09 00:00:00 upload java spring-mvc

我有一个 Spring MVC 网络,它有两个不同的页面,它们有不同的表单来上传不同的文件.其中一个应该有 2MB 的限制,而另一个应该有 50MB 的限制.

I have a Spring MVC web with two different pages that have different forms to upload different files. One of them should have a limitation of 2MB, while the other should have a 50MB limitation.

现在,我的 app-config.xml 中有这个限制:

Right now, I have this limitation in my app-config.xml:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- one of the properties available; the maximum file size in bytes (2097152 B = 2 MB) -->
    <property name="maxUploadSize" value="2097152 "/>
</bean>

我可以像这样在我的主控制器中解决 maxUploadSize 异常:

And I could resolve the maxUploadSize exception in my main controller like that:

@Override
public @ResponseBody
ModelAndView resolveException(HttpServletRequest arg0,
        HttpServletResponse arg1, Object arg2, Exception exception) {
    ModelAndView modelview = new ModelAndView();
        String errorMessage = "";
        if (exception instanceof MaxUploadSizeExceededException) {
            errorMessage =  String.format("El tamaño del fichero debe ser menor de  %s", UnitConverter.convertBytesToStringRepresentation(((MaxUploadSizeExceededException) exception)
                    .getMaxUploadSize()));

        } else {
            errorMessage = "Unexpected error: " + exception.getMessage();
        }
        saveError(arg0, errorMessage);
        modelview = new ModelAndView();
        modelview.setViewName("redirect:" + getRedirectUrl());
    }
    return modelview;
}

但这显然只控制了 2MB 的限制.我怎么能限制 20MB 的呢?我试过这个解决方案:https://stackoverflow.com/a/11792952/1863783,它更新了限制运行.但是,这会为每个会话和每个控制器更新它.因此,如果一个用户正在为第一个表单上传文件,另一个使用第二个表单上传的用户应该有第一个的限制......

But this, obviously, only controlls the 2MB limit. How could I make the limitation for the 20MB one? I've tried this solution: https://stackoverflow.com/a/11792952/1863783, which updates the limitation in runtime. However, this updates it for every session and every controller. So, if one user is uploading a file for the first form, another using uploading in the second form should have the limitation of the first one...

有什么帮助吗?谢谢

推荐答案

乍一看似乎不是最好的解决方案,但这取决于您的要求.

It may seem like not the best solution at first sight, but it depends on your requirements.

您可以为所有控制器设置一个具有最大上传大小的全局选项,并为特定控制器使用较小的值覆盖它.

You can set a global option with maximum upload size for all controllers and override it with lower value for specific controllers.

application.properties 文件(Spring Boot)

application.properties file (Spring Boot)

spring.http.multipart.max-file-size=50MB

使用检查上传控制器

public void uploadFile(@RequestPart("file") MultipartFile file) {
    final long limit = 2 * 1024 * 1024;    // 2 MB
    if (file.getSize() > limit) {
        throw new MaxUploadSizeExceededException(limit);
    }
    StorageService.uploadFile(file);
}

如果文件大于 2MB,您将在日志中看到此异常:

In case of a file bigger than 2MB you'll get this exception in log:

org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 2097152 bytes exceeded

相关文章