2016-05-31 511 views
23

我正在使用JHipster开发基于Spring Boot和AngularJS的应用程序。 我的问题是如何设置上传文件的最大大小如何设置上传文件的最大大小

如果我想上传到大文件,我得到的控制台这样的信息:与状态500

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.] 

和服务器响应如何设置呢?

回答

14

您需要将参数multipart.maxFileSizemultipart.maxRequestSize设置为比默认值更高的值。这可以在你的spring引导配置yml文件中完成。例如,加入以下application.yml将允许用户上传10Mb以下文件:如果用户需要能够上传多个文件在一个单一的请求,他们的总和可能会超过10MB

multipart: 
    maxFileSize: 10Mb 
    maxRequestSize: 10Mb 

,则需要配置multipart.maxRequestSize到一个更高的价值:

multipart: 
    maxFileSize: 10Mb 
    maxRequestSize: 100Mb 

来源:https://spring.io/guides/gs/uploading-files/在春季启动1.4

+2

我补充这一点:HTTP: 多: maxFileSize为:100兆 maxRequestSize:100Mb的 弹簧部分,但它并没有帮助。 – tibi

+2

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

4

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

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

空白是重要的,你cannot use tabs for indentation

+0

如果这是一个需要在dev和prod中设置的属性,只需将其添加到'application.yml'就会使其级联到两个配置文件,因此您不需要设置两次。 – geraldhumphries

9

当我们在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的引导

0

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

Apache Tomcat 8 Configuration Reference

maxSwallowSize: The maximum number of request body bytes (excluding transfer encoding overhead) that will be swallowed by Tomcat for an aborted upload. An aborted upload is when Tomcat knows that the request body is going to be ignored but the client still sends it. If Tomcat does not swallow the body the client is unlikely to see the response. If not specified the default of 2097152 (2 megabytes) will be used. A value of less than zero indicates that no limit should be enforced.

对于Springboot嵌入的Tomcat声明一个TomcatEmbeddedServletContainerFactory

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

爪哇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

1

我知道这是非常晚的比赛,但我想后我用mysql时所面临的另一个问题,如果任何人将来面临同样的问题。

正如上面提到的一些答案,在application.properties设置这些,因为我用mysql MEDIUMBLOB类型来存储文件将主要解决的问题

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

我将它设置为16 MB, 。

但修复application.properties后,当上传一个大于4MB的文件时出现错误: org.springframework.dao.TransientDataAccessResourceException:PreparedStatementCallback; SQL [insert into 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; 
1

春天开机2 +,请确保您使用的spring.servlet代替spring.http

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

如果你有使用Tomcat,你可能最终创造EmbeddedServletContainerCustomizer,这是不是非常好的事情。

如果你可以没有托马,你可以replace tomcat with e.g. undertow,并避免这个问题。

+0

spring.servlet的变化已经在spring boot 2+中引入,值得编辑你的答案,因为它以前是(spring boot <= 1.5.9)spring.http.multipart – bluelabel

相关问题