web-dev-qa-db-ja.com

SpringBootの@MultipartConfig maxFileSizeが有効にならない

MultipartConfigアノテーションが付いたコントローラーがあります(そのスニペットを以下に示します)。

@RestController
@RequestMapping("packages")
@MultipartConfig(maxFileSize = 1024*1024*1024, maxRequestSize = 1024*1024*1024)
public class PackagesController
{
    @RequestMapping(method = RequestMethod.POST)
    public String create(@RequestParam("package") MultipartFile uploadedPackage)
    {
        // do stuff to the file
        return "create";
    }
}

ただし、このエンドポイントにファイルをアップロードすると、デフォルトのマルチパート構成値を使用しているように見えます。

Caused by: org.Apache.Tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field package exceeds its maximum permitted size of 1048576 bytes.
    at org.Apache.Tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.Java:633) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.Apache.Tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.Java:76) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.Apache.Tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.Java:135) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at Java.io.FilterInputStream.read(FilterInputStream.Java:107) ~[na:1.8.0_45]
    at org.Apache.Tomcat.util.http.fileupload.util.Streams.copy(Streams.Java:98) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.Apache.Tomcat.util.http.fileupload.util.Streams.copy(Streams.Java:68) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.Apache.Tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.Java:293) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.Apache.catalina.connector.Request.parseParts(Request.Java:2776) ~[Tomcat-embed-core-8.0.32.jar:8.0.32]
    ... 30 common frames omitted

私のアプリケーションは次のようになります。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }

}

@MultipartConfigアノテーションを有効にするために不足しているものはありますか?

26
Nic Wolfe

マルチパートプロパティのみを制御する場合は、multipart.max-file-sizeおよびmultipart.max-request-sizeプロパティを使用できます。たとえば、次の設定を100Mbファイルに追加することで、最大サイズをapplication.propertiesに引き上げることができます。

multipart.max-file-size=100MB
multipart.max-request-size=100MB

値には、接尾辞MBまたはKBを使用して、Megabyteまたはを示すことができますキロバイトサイズ。

内部では、Spring BootはMultipartConfigElementに基づいてMultipartPropertiesを作成し、そのMultipartConfigElementSpring MVC documentation =。詳細については MultipartAutoConfiguration および DispatcherServletConfiguration およびCheckout Spring Boot documentation をご覧ください。

21
Ali Dehghani

Spring Boot 2.0では、これをapplication.ymlで使用する必要があります

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

ドキュメント から:

Spring Bootは、ファイルのアップロードをサポートするためにServlet 3 javax.servlet.http.Part APIを採用しています。デフォルトでは、Spring Bootはファイルごとに最大サイズ1MBと最大10MB1回のリクエストでのファイルデータ。 MultipartPropertiesクラスで公開されているプロパティを使用して、これらの値、中間データの保存場所(/tmpディレクトリなど)、およびデータがディスクにフラッシュされるしきい値をオーバーライドできます。たとえば、ファイルを無制限に指定する場合は、spring.servlet.multipart.max-file-sizeプロパティを-1に設定します。

ドキュメントの付録A から抽出

spring.servlet.multipart.max-file-size = 1MB#最大ファイルサイズ。値は、サフィックス「MB」または「KB」を使用して、それぞれメガバイトまたはキロバイトを示すことができます。

spring.servlet.multipart.max-request-size = 10MB#最大リクエストサイズ。値は、サフィックス「MB」または「KB」を使用して、それぞれメガバイトまたはキロバイトを示すことができます。

26
T4keo

Spring-boot 1.5.3では、application.ymlで次のコードを使用する必要があります

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

Yamlファイルではタブではなくスペースを使用してください。

25
tla

マルチパートアップロードのカスタム制限を設定するには、以下のプロパティを使用します(サンプルサイズ30MBの場合):

spring.http.multipart.max-file-size=30MB
spring.http.multipart.max-request-size=30MB

私たちの会社のプロジェクトでは、そのうちの1つがSpring Bootバージョン1.3.5であることがわかったため、バージョン<1.4の場合は

multipart.max-file-size=30MB
multipart.max-request-size=30MB

docs(v1.4.0) から:

Spring Bootはサーブレット3を包含しますjavax.servlet.http.PartファイルのアップロードをサポートするAPI。既定では、Spring Bootは、Spring MVCを1ファイルあたり最大1MBのファイルで構成し、1回の要求で最大10MBのファイルデータを構成します。これらの値と、中間データが保存されている場所(たとえば、/tmpディレクトリ)およびMultipartPropertiesクラスで公開されているプロパティを使用して、データがディスクにフラッシュされるしきい値。たとえば、ファイルを無制限に指定する場合は、spring.http.multipart.max-file-sizeプロパティから-1

マルチパートサポートは、マルチパートでエンコードされたファイルデータを@RequestParam- Spring MVCコントローラーハンドラーメソッドのMultipartFile型の注釈付きパラメーター。

バージョン1.3.8の同じドキュメント:

たとえば、ファイルを無制限に指定する場合は、multipart.maxFileSizeプロパティから-1

20
cst1992

Spring Boot v2 +の場合、application.propertiesに次を追加します。

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=40MB
10
user1188867

Jenkinsスクリプトを介して値が挿入される展開では、「-」は許可されません。つかいます:

env:
  - name: SPRING_SERVLET_MULTIPART_MAXREQUESTSIZE
    value: "10MB"
  - name: SPRING_SERVLE
    value: "10MB"
0
theshadog

アプリケーションプロパティは1つのオプションです。別のオプションは

@Bean
public MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
  factory.setMaxFileSize("10MB");
  factory.setMaxRequestSize("10MB");
  return factory.createMultipartConfig();
}
0
user1941489