web-dev-qa-db-ja.com

アップロードファイルの最大サイズを設定する方法

JHipsterを使用して、Spring BootとAngularJSに基づくアプリケーションを開発しています。私の質問は、設定方法アップロードするファイルの最大サイズ

大きなファイルにアップロードしようとすると、コンソールにこの情報が表示されます。

  DEBUG 11768 --- [io-8080-exec-10] c.a.app.aop.logging.LoggingAspect: 

Enter: com.anuglarspring.app.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] = 

[org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is Java.lang.IllegalStateException: 

org.Apache.Tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]

ステータス500のサーバー応答。

それを設定するには?

46
Michał Styś

また、Spring Boot 1.4では、application.propertiesに次の行を追加して、ファイルサイズの制限を設定できます。

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

私のために働いた。ソース: https://spring.io/guides/gs/uploading-files/

UPDATE:

誰かが2つのプロパティの違いを尋ねました。

以下は正式な定義です。

MaxFileSize:アップロードされたファイルに許可される最大サイズ(バイト単位)。アップロードされたファイルのサイズがこのサイズより大きい場合、Webコンテナは例外(IllegalStateException)をスローします。デフォルトのサイズは無制限です。

MaxRequestSize:multipart/form-dataリクエストに許可される最大サイズ(バイト単位)。アップロードされたすべてのファイルの全体サイズがこのしきい値を超えると、Webコンテナーは例外をスローします。デフォルトのサイズは無制限です。

それぞれを説明するには:

MaxFileSize:アップロードする単一ファイルの制限。これは、単一ファイルの制限にのみ適用されます。

MaxRequestSize:単一のアップロードリクエスト内のすべてのファイルの合計サイズの制限。これにより、合計制限がチェックされます。 1つのアップロードリクエストに対して2つのファイルa.txtb.txtがあるとします。 a.txt5kbおよびb.txt7kbなので、MaxRequestSize12kbより上でなければなりません。

61

Spring Boot 2では、spring.http.multipartspring.servlet.multipartに変更されました

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#multipart-configuration

20
Allar Saarnak

multipart.maxFileSizeおよびmultipart.maxRequestSizeパラメーターをデフォルトよりも高い値に設定する必要があります。これは、スプリングブート構成ymlファイルで実行できます。たとえば、次をapplication.ymlに追加すると、ユーザーは10Mbファイルをアップロードできます。

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

ユーザーが1つのリクエストで複数のファイルをアップロードできる必要があり、合計で10Mbを超える場合、multipart.maxRequestSizeをより高い値に設定する必要があります。

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

ソース: https://spring.io/guides/gs/uploading-files/

19
geraldhumphries

Spring Boot 2. +では、spring.servletの代わりにspring.httpを使用していることを確認してください。

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

Tomcatを使用する必要がある場合は、 EmbeddedServletContainerCustomizer を作成することになりますが、これは実際には良いことではありません。

Tomatなしで生活できる場合は、 Tomcatをundertowなどに置き換えて にして、この問題をまったく回避できます。

16

Application.propertiesとapplication yamlでプロパティを定義するとき、いくつかの違いがあります。

Application.ymlで:

spring:
    http:
      multipart:
       max-file-size: 256KB
       max-request-size: 256KB

そしてapplication.propetiesで:

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

注:Springバージョン4.3およびSpringブート1.4

15
denzal

spring 2.xで。オプションがわずかに変更されました。したがって、上記の答えはほぼ正しいですが、完全にではありません。 application.propertiesファイルに、以下を追加します-

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
7
sapy

具体的には、application.yml構成ファイルで、「spring:」セクションに次を追加します。

http:
    multipart:
        max-file-size: 512MB
        max-request-size: 512MB

空白は重要であり、 インデントにタブを使用することはできません

6
MobileMateo

Expert Exchangeで解決策を見つけましたが、うまくいきました。

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

参照: https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html

Spring boot application.propertiesのこれらのプロパティにより、許容可能なファイルサイズが無制限になります-

# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
4
thedevd

私はこれがゲームに非常に遅れていることを知っていますが、将来同じ問題に直面した場合、mysqlを使用するときに直面した追加の問題を投稿したかったです。

上記の回答の一部として、application.propertiesでこれらを設定すると、ほとんどの問題が修正されます

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

Mysql MEDIUMBLOBデータ型を使用してファイルを保存しているため、16 MBに設定しています。

ただし、application.propertiesを修正した後、4MBを超えるファイルをアップロードすると、次のエラーが発生しました:org.springframework.dao.TransientDataAccessResourceException:PreparedStatementCallback; SQL [test_doc(doc_id、duration_of_doc、doc_version_id、file_name、doc)の値(?、?、?、?、?、?)に挿入];クエリのパケットが大きすぎます(6656781> 4194304)。 max_allowed_pa​​cket '変数を設定することにより、サーバーでこの値を変更できます。ネストされた例外はcom.mysql.jdbc.PacketTooBigException:クエリのパケットが大きすぎます(6656781> 4194304)。 max_allowed_pa​​cket '変数を設定することにより、サーバーでこの値を変更できます。

したがって、mysqlからこのコマンドを実行しました。

SET GLOBAL max_allowed_packet = 1024*1024*16;
2
she12

spring-boot-1.3.5.RELEASEを使用していますが、同じ問題がありました。上記の解決策はどれも私にとってうまくいきません。しかし、最後に次のプロパティをapplication.propertiesに追加すると、問題が修正されました。

multipart.max-file-size=10MB
2

「接続のリセット」エラーが表示される場合、Tomcat 7.0.55から追加されたTomcatデフォルトコネクタmaxSwallowSize属性に問題がある可能性があります( ChangeLog

から Apache Tomcat 8構成リファレンス

maxSwallowSize:アップロードの中止のためにTomcatによって飲み込まれるリクエストボディバイトの最大数(転送エンコーディングオーバーヘッドを除く)。アップロードの中止とは、Tomcatがリクエスト本文が無視されることを認識しているが、クライアントがそれを送信し続けている場合です。 Tomcatが本文を飲み込まない場合、クライアントは応答を確認する可能性が低くなります。指定しない場合、デフォルトの2097152(2メガバイト)が使用されます。ゼロ未満の値は、制限を実施しないことを示します。

Springboot埋め込みTomcatの場合、TomcatEmbeddedServletContainerFactoryを宣言します

Java 8:

@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
    TomcatEmbeddedServletContainerFactory Tomcat = new TomcatEmbeddedServletContainerFactory();
    Tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
        if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
            //-1 for unlimited
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
    });
    return Tomcat;
}

Java 7:

@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
    TomcatEmbeddedServletContainerFactory Tomcat = new TomcatEmbeddedServletContainerFactory();
    Tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer()  {
        @Override
        public void customize(Connector connector) {
            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                //-1 for unlimited
                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        }
    });
    return Tomcat;
}

または5MBのTomcat/conf/server.xmlで

<Connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="8443"
       maxSwallowSize="5242880" />
1
Alex

私にとっては以前の作品は何もありません(おそらくyamlでアプリケーションを使用することはここの問題です)が、それを使用してその問題に乗ります:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@ServletComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofBytes(512000000L));
        factory.setMaxRequestSize(DataSize.ofBytes(512000000L));
        return factory.createMultipartConfig();
    }
}
0
user11999314

上記の設定はどれも、Springアプリケーションでは機能しませんでした。

このコードをメインのapplicationクラス(@SpringBootApplicationアノテーションが付けられたクラス)に実装すると、うまくいきました。

@Bean 
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
     return (ConfigurableEmbeddedServletContainer container) -> {

              if (container instanceof TomcatEmbeddedServletContainerFactory) {

                  TomcatEmbeddedServletContainerFactory Tomcat = (TomcatEmbeddedServletContainerFactory) container;
                  Tomcat.addConnectorCustomizers(
                          (connector) -> {
                              connector.setMaxPostSize(10000000);//10MB
                          }
                  );
              }
    };
}

ステートメントで許容サイズを変更できます。

connector.setMaxPostSize(10000000); // 10MB

0
Tomer Shay

この例外を回避するには、Spring 1.5.8.RELEASEで使用したのと同じように、VM引数を利用できます。

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb
0
Khushboo Sharma

サーブレット:multipart:enabled:true max-file-size:900000000#900M max-request-size:900000000

0
Gank