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

Goy*_*oyo 13 java upload spring-mvc

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

现在,我在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>
Run Code Online (Sandbox Code Playgroud)

我可以解决我的主控制器中的maxUploadSize异常:

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

有帮助吗?谢谢

naX*_*aXa 5

乍看起来似乎不是最佳解决方案,但这取决于您的要求。

您可以为所有控制器设置一个最大上传大小的全局选项,并为特定控制器设置一个较低的值。

application.properties文件(Spring引导)

spring.http.multipart.max-file-size=50MB
Run Code Online (Sandbox Code Playgroud)

带有检查的上传控制器

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);
}
Run Code Online (Sandbox Code Playgroud)

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

org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 2097152 bytes exceeded
Run Code Online (Sandbox Code Playgroud)


Bha*_*ikh 4

这是可能的:覆盖该类DispatcherServlet。一个示例可能如下所示:

public class CustomDispatcherServlet extends DispatcherServlet {

    private Map<String, MultipartResolver> multipartResolvers;

    @Override
    protected void initStrategies(ApplicationContext context) {
            super.initStrategies(context);
            initMultipartResolvers(context);
    }

    private void initMultipartResolvers(ApplicationContext context) {
            try {
                    multipartResolvers = new HashMap<>(context.getBeansOfType(MultipartResolver.class));
            } catch (NoSuchBeanDefinitionException ex) {
                    // Default is no multipart resolver.
                    this.multipartResolvers = Collections.emptyMap();
            }
    }

    @Override
    protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
            if (this.multipartResolvers.isEmpty() && this.multipartResolvers.get(0).isMultipart(request)) {
                    if (request instanceof MultipartHttpServletRequest) {
                            logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, "
                                    + "this typically results from an additional MultipartFilter in web.xml");
                    } else {
                            MultipartResolver resolver = getMultipartResolverBasedOnRequest(request);
                            return resolver.resolveMultipart(request);
                    }
            }
            // If not returned before: return original request.
            return request;
    }

    private MultipartResolver getMultipartResolverBasedOnRequest(HttpServletRequest request) {
            // your logic to check the request-url and choose a multipart resolver accordingly.
            String resolverName = null;
            if (request.getRequestURI().contains("SomePath")) {
                    resolverName = "resolver1";
            } else {
                    resolverName = "resolver2";
            }
            return multipartResolvers.get(resolverName);
    }
}
Run Code Online (Sandbox Code Playgroud)

假设您在应用程序上下文中配置了多个 MultipartResolvers(在示例代码中可能名为“resolver1”和“resolver2”)。

当然,当您DispatcherServlet在 中配置 时web.xml,您使用此类而不是 Spring DispatcherServlet

另一种方法:也可以使用MultipartFilter 只需重写lookupMultipartResolver(HttpServletRequest request)方法并自行查找所需的解析器。然而,这也有一些假设和但是。使用之前先查阅文档。