Multipart文件最大大小异常 - spring boot嵌入式tomcat

问题描述 投票:6回答:5

我已将最大文件大小设置为

multipart.maxFileSize: 1mb
multipart.maxRequestSize: 1mb

这是我的控制器:

@RequestMapping(method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
@Secured(Privileges.CAN_USER_READ)
public void create(@RequestParam("file")final MultipartFile file,Principal principal) throws IllegalStateException, IOException,MultipartException{

    medicalHistoryService.create(new MedicalHistory(file));
}

这是错误消息

2016-03-03 13:48:24.560  WARN 4992 --- [nio-8080-exec-1] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576)

2016-03-03 13:48:25.545  WARN 4992 --- [nio-8080-exec-2] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576)

请求超大文件后的最终结果是加载页面的问题。我没有在堆栈跟踪中得到任何其他错误,所以我有点坚持实际发生的事情。哦,是的,我已经尝试了许多其他解决方案,如注册过滤器,在ErrorController中处理异常。每次我都会得到相同的结果 - 服务器crash.Tomcat crash

编辑2

我的异常处理类:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler{

// 413 MultipartException - file size too big 
@ExceptionHandler({MultipartException.class,FileSizeLimitExceededException.class,java.lang.IllegalStateException.class})
public ResponseEntity<Object> handleSizeExceededException(final WebRequest request, final MultipartException ex) {
    //log.warn("413 Status Code. File size too large {}", ex.getMessage());
    log.warn(ex.getMessage());
    final ApiError apiError = message(HttpStatus.PAYLOAD_TOO_LARGE, ex);
    return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request);
}

}

spring spring-boot multipartform-data multipart embedded-tomcat-8
5个回答
16
投票

从Spring Boot 2开始

spring.servlet.multipart.max-file-size=128KB spring.servlet.multipart.max-request-size=128KB

docs

Spring Boot 1.x

属性应该像: spring.http.multipart.max-file-size=128KB spring.http.multipart.max-request-size=128KB

spring boot guides


11
投票

这很棘手。 Tomcat属性MaxSwallowSize导致了这个问题。显然它是在最新版本的Tomcat之一中引入的。它背后的整个想法是,如果Tomcat意识到请求将被拒绝,终止高于默认2mb的连接(至少这是我的解释)。简单覆盖此属性可修复问题。我意识到这不是完美的解决方案,但它比终止连接要好得多。

@Bean
public TomcatEmbeddedServletContainerFactory containerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
     factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
         ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
     });
     return factory;
}

3
投票

请在application.properties中为spring boot version -2.0.1.RELEASE添加以下行

spring.servlet.multipart.max-file-size=128MB
spring.servlet.multipart.max-request-size=128MB
spring.servlet.multipart.enabled=true

这解决了我的问题。


3
投票

由于@SeaBiscuit提供了正确答案,但是使用Spring引导2.0.0.RELEASE,类org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory已被删除并被类org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory取代。所以新的Spring boot 2.0.0的代码就是

  1. 创建一个具有任何名称的类,并使用@Configuration对其进行注释
  2. 并将下面的代码放在该类中
@Bean
public TomcatServletWebServerFactory containerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
    });
    return factory;
}

如果您在Spring boot 2.0.0中配置最大文件上载大小时遇到​​问题,请将“application.propertise”文件中的代码放在“MB”中所需的文件大小下面

## Image upload limitation properties
spring.servlet.multipart.max-file-size=3MB
spring.servlet.multipart.max-request-size=3MB

1
投票

我在application.yml中写了一些代码来解决这个问题:

spring:
    http:
        multipart:
            max-file-size: 10MB
            max-request-size: 10MB

我在application.properties中编写但在yml中没有写入。

© www.soinside.com 2019 - 2024. All rights reserved.