web-dev-qa-db-ja.com

マルチパートファイルの最大サイズの例外-Spring Boot Embedded Tomcat

最大ファイルサイズを

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での例外処理など、他の多くの解決策を試しました。私が同じ結果になるたびに-サーバークラッシュ 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);
}

}

9
SeaBiscuit

これはトリッキーでした。 TomcatプロパティMaxSwallowSizeがこの問題の原因でした。どうやら、Tomcatの最近のバージョンの1つで導入されたようです。その背後にあるアイデア全体は、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;
}
11
SeaBiscuit

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

スプリングブートガイドを参照

19
jimmbraddock

以下の行をapplication.propertiesに追加してください-スプリングブートバージョン-2.0.1.RELEASE

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

これで私の問題は解決しました。

3
vikash singh

@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
3

この問題を解決するために、application.ymlに次のような行を書きました。

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

私がapplication.propertiesに書いたがymlには書いていなかった間、それは役に立ちました。

1
Sohel Ravankole