【问题标题】:How to set the max size of upload file如何设置上传文件的最大大小
【发布时间】:2016-09-29 03:09:11
【问题描述】:

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

如何设置?

【问题讨论】:

    标签: tomcat file-upload spring-boot jhipster


    【解决方案1】:

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

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

    用于spring boot 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.txt 用于单个上传请求。 a.txt5kbb.txt7kb 所以MaxRequestSize 应该高于 12kb.

    【讨论】:

    • 我在 spring boot 2.0.1 spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB987654325@ 中使用了以下内容
    • max-file-sizemax-request-size有什么区别?
    • max-file-size --> 单个文件上传的最大大小。 max-request-size --> 单个上传请求中所有文件的总大小限制。所以;如果要增加上传大小,则必须同时增加这两个值,因为一个用于单个文件限制,另一个用于单个请求中所有文件的总大小。
    • 如果您使用Spring Boot进行微服务开发,您必须在网关服务中添加相同的配置以防止上传错误。我希望它能帮我解决我遇到的麻烦
    • 正如@AguThadeus 建议使用网关设置进行微服务开发,我们还需要在网关属性中添加spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
    【解决方案2】:

    在 Spring Boot 2 中,spring.http.multipart 更改为 spring.servlet.multipart

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

    【讨论】:

    • 祝福你先生!!
    • 你拯救了我的一天!
    • 是什么促使 Pivotal 公司做出这种改变?我觉得这可能是 Spring Boot 升级到 Spring Boot 2 的开销。
    【解决方案3】:

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

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

    如果你必须使用 tomcat,你最终可能会创建 EmbeddedServletContainerCustomizer,这并不是什么好事。

    如果你可以不吃番茄,你可以replace tomcat with e.g. undertow 并完全避免这个问题。

    【讨论】:

    • spring.servlet 的更改已在 spring boot 2+ 中引入,值得像以前一样编辑您的答案 (spring boot
    • 或:spring.servlet.multipart.max-file-size=10MBspring.servlet.multipart.max-request-size=10MB
    • 同意#Swiggels。使用 spring.servlet... 对于运行版本 > 1.5.9 的用户。
    【解决方案4】:

    您需要将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/

    【讨论】:

    • 我在 spring 部分添加了这个:http: multipart: maxFileSize: 100Mb maxRequestSize: 100Mb 但它没有帮助。
    • @tibi 如果您使用的是 Sprint Boot 1.4.x,请检查网站管理员的回答,因为此属性已更改。
    【解决方案5】:

    我们在 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 boot 1.4

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        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
        

        【讨论】:

          【解决方案8】:

          我在 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

          【讨论】:

            【解决方案9】:

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

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

            空格很重要,你cannot use tabs for indentation

            【讨论】:

            • 如果这是一个需要在 dev 和 prod 中设置的属性,只需将其添加到 application.yml 将导致它级联到两个配置文件,因此您无需设置两次。
            【解决方案10】:

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

            multipart.max-file-size=10MB
            

            【讨论】:

            • 也适用于 Spring Boot v1.2.3.RELEASE
            【解决方案11】:

            我知道这对游戏来说已经很晚了,但我想发布我在使用 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;
            

            【讨论】:

              【解决方案12】:

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

              来自Apache Tomcat 8 Configuration Reference

              ma​​xSwallowSize: 最大请求体字节数(不包括传输编码 开销)将被 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" />
              

              【讨论】:

                【解决方案13】:

                与 Askerali Maruthullathil 的 answer 一致,这对我有用(Spring boot with Spring 5.2.2):

                @Configuration
                public class MultipartRequestFileConfig {
                
                    @Bean(name = "multipartResolver")
                    public CommonsMultipartResolver multipartResolver() {
                        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
                        resolver.setDefaultEncoding("UTF-8");
                        resolver.setResolveLazily(true);
                        resolver.setMaxInMemorySize(83886080);
                        resolver.setMaxUploadSize(83886080);
                        return resolver;
                    }
                }
                

                【讨论】:

                  【解决方案14】:

                  为避免此异常,您可以使用 VM 参数,就像我在 Spring 1.5.8.RELEASE 中使用的那样:

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

                  【讨论】:

                  • VM 参数可以覆盖 application.yml 中给出的值
                  【解决方案15】:

                  以上配置都不适用于 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

                  【讨论】:

                    【解决方案16】:

                    对我来说没有任何以前的作品(也许在这里使用带有 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();
                        }
                    }
                    

                    【讨论】:

                      【解决方案17】:

                      我在 spring-boot 2.5.2 中使用过这个配置,它运行良好:

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

                      看官方文档:https://spring.io/guides/gs/uploading-files/

                      【讨论】:

                        【解决方案18】:

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

                        server:
                          servlet:
                            multipart:
                              enabled: true
                              max-file-size: 900000000  #900M
                              max-request-size: 900000000
                        

                        【讨论】:

                          猜你喜欢
                          • 2020-01-17
                          • 1970-01-01
                          • 2019-12-16
                          • 2019-12-05
                          • 1970-01-01
                          • 2018-06-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多