如何设置上传文件的最大大小


78

我正在使用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。

如何设置?

Answers:


122

同样在Spring boot 1.4中,您可以将以下行添加到application.properties中以设置文件大小限制:

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

对于春季靴2.x及更高版本

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

为我工作。资料来源:https : //spring.io/guides/gs/uploading-files/

更新:

有人问这两个属性之间的区别。

以下是正式定义:

MaxFileSize:允许上传的文件的最大大小,以字节为单位。如果任何上传的文件的大小大于该大小,则Web容器将引发异常(IllegalStateException)。默认大小是无限的。

MaxRequestSize:多部分/表单数据请求允许的最大大小,以字节为单位。如果所有上载文件的总大小超过此阈值,则Web容器将引发异常。默认大小是无限的。

每个解释:

MaxFileSize:上传单个文件的限制。这仅适用于单个文件限制。

MaxRequestSize:单个上传请求中所有文件总大小的限制。这将检查总限制。假设您有一个上传请求有两个文件a.txtb.txtA.TXT5kb的b.txt7KB所以MaxRequestSize应高于12KB


9
我在弹簧靴2.0.1中使用了以下内容 spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
Nagaraja JB

1
max-file-size和之间有什么区别max-request-size
阿伦·古达

3
max-file-size->单个文件上传的最大大小。max-request-size->单个上传请求中所有文件总大小的限制。所以; 如果要增加上传大小,则必须同时增加这两个值,因为一个是单个文件的限制,一个是单个请求中所有文件的总大小。
Bahadir Tasdemir '18

1
如果您使用Spring Boot进行微服务开发,则必须向网关服务添加相同的配置,以防止上传错误。我希望它可以
免除

正如@AguThadeus建议使用网关设置进行微服务开发一样,我们还需要spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB在网关属性中添加
Sandeep K Nair


23

对于Spring Boot 2. +,请确保您使用spring.servlet而不是spring.http

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

如果必须使用tomcat,最终可能会创建EmbeddedServletContainerCustomizer,但这并不是一件好事。

如果您可以没有tomat生活,则可以将tomcat替换为例如undertow,并完全避免出现此问题。


在spring boot 2+中引入了spring.servlet的更改,值得像以前那样编辑您的答案(spring boot <= 1.5.9)spring.http.multipart
bluelabel,

或: spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
SWiggels

同意#SWiggels。对于运行版本> 1.5.9的用户,请使用spring.servlet...。
吉安

21

您需要将multipart.maxFileSizemultipart.maxRequestSize参数设置为比默认值更高的值。这可以在您的Spring Boot配置yml文件中完成。例如,添加以下内容application.yml将允许用户上传10Mb文件:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

如果用户需要能够在单个请求中上传多个文件,并且它们的总大小可能超过10Mb,那么您将需要配置multipart.maxRequestSize为更高的值:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

资料来源:https : //spring.io/guides/gs/uploading-files/


3
我在弹簧部分添加了以下内容:http:multipart:maxFileSize:100Mb maxRequestSize:100Mb,但这没有帮助。
tibi

2
@tibi(如果您使用的是Sprint Boot 1.4.x)请检查网站站长的答案,因为此属性已更改。
AndreLDM

15

当我们在application.properties和application yaml中定义属性时,存在一些差异。

在application.yml中:

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

并在application.properties中:

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

注意:Spring 4.3和Spring Boot 1.4


11

在中spring 2.x。选项略有变化。因此,以上答案几乎是正确的,但并非完全正确。在您的application.properties文件中,添加以下内容-

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

6

更具体地说,在您的application.yml配置文件中,将以下内容添加到“ spring:”部分。

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

空格很重要,您不能使用制表符缩进


如果这是需要同时在dev和prod中设置的属性,则只需将其添加到该属性即可application.yml将其级联到两个配置文件,因此您无需设置两次。
geraldhumphries,2013年

5

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

我正在使用spring-boot-1.3.5.RELEASE,但遇到了同样的问题。上述解决方案都不适合我。但是最后添加了以下属性可以application.properties解决问题。

multipart.max-file-size=10MB

2
还适用于Spring Boot v1.2.3.RELEASE
DjAlan

2

我知道这对游戏来说太晚了,但是如果以后有人遇到相同的问题,我想发布我在使用mysql时遇到的其他问题。

正如上面提到的一些答案一样,在application.properties中设置这些内容通常可以解决问题

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

我将其设置为16 MB,因为我使用的是mysql MEDIUMBLOB数据类型来存储文件。

但是在修复了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

如果出现“连接重置”错误,则问题可能出在从Tomcat 7.0.55(ChangeLog)添加的Tomcat默认连接器maxSwallowSize属性中。

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;
}

或在Tomcat / conf / server.xml中保留5MB

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

0

上面的配置都不适用于Spring应用程序。

在主应用程序类(用@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

为了避免这种异常,您可以像在Spring 1.5.8.RELEASE中一样使用VM参数。

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb

VM参数可以覆盖application.yml中给出的值
Khushboo Sharma,

0

对我而言,以前的工作都没有(也许在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

将此application.yml文件放入您的文件中以允许上传最大900 MB的文件

server:
  servlet:
    multipart:
      enabled: true
      max-file-size: 900000000  #900M
      max-request-size: 900000000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.