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のサーバー応答。
それを設定するには?
また、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.txtとb.txtがあるとします。 a.txtは5kbおよびb.txtは7kbなので、MaxRequestSize
は12kbより上でなければなりません。
Spring Boot 2では、spring.http.multipart
がspring.servlet.multipart
に変更されました
multipart.maxFileSize
およびmultipart.maxRequestSize
パラメーターをデフォルトよりも高い値に設定する必要があります。これは、スプリングブート構成ymlファイルで実行できます。たとえば、次をapplication.yml
に追加すると、ユーザーは10Mbファイルをアップロードできます。
multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb
ユーザーが1つのリクエストで複数のファイルをアップロードできる必要があり、合計で10Mbを超える場合、multipart.maxRequestSize
をより高い値に設定する必要があります。
multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb
Spring Boot 2. +では、spring.servlet
の代わりにspring.http
を使用していることを確認してください。
---
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
Tomcatを使用する必要がある場合は、 EmbeddedServletContainerCustomizer を作成することになりますが、これは実際には良いことではありません。
Tomatなしで生活できる場合は、 Tomcatをundertowなどに置き換えて にして、この問題をまったく回避できます。
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
spring 2.x
で。オプションがわずかに変更されました。したがって、上記の答えはほぼ正しいですが、完全にではありません。 application.properties
ファイルに、以下を追加します-
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
具体的には、application.yml
構成ファイルで、「spring:」セクションに次を追加します。
http:
multipart:
max-file-size: 512MB
max-request-size: 512MB
空白は重要であり、 インデントにタブを使用することはできません 。
Expert Exchangeで解決策を見つけましたが、うまくいきました。
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("124MB");
factory.setMaxRequestSize("124MB");
return factory.createMultipartConfig();
}
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
私はこれがゲームに非常に遅れていることを知っていますが、将来同じ問題に直面した場合、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_packet '変数を設定することにより、サーバーでこの値を変更できます。ネストされた例外はcom.mysql.jdbc.PacketTooBigException:クエリのパケットが大きすぎます(6656781> 4194304)。 max_allowed_packet '変数を設定することにより、サーバーでこの値を変更できます。
したがって、mysqlからこのコマンドを実行しました。
SET GLOBAL max_allowed_packet = 1024*1024*16;
spring-boot-1.3.5.RELEASE
を使用していますが、同じ問題がありました。上記の解決策はどれも私にとってうまくいきません。しかし、最後に次のプロパティをapplication.properties
に追加すると、問題が修正されました。
multipart.max-file-size=10MB
「接続のリセット」エラーが表示される場合、Tomcat 7.0.55から追加されたTomcatデフォルトコネクタmaxSwallowSize属性に問題がある可能性があります( ChangeLog )
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" />
私にとっては以前の作品は何もありません(おそらく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();
}
}
上記の設定はどれも、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
この例外を回避するには、Spring 1.5.8.RELEASEで使用したのと同じように、VM引数を利用できます。
-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb
サーブレット:multipart:enabled:true max-file-size:900000000#900M max-request-size:900000000