2016-05-31 261 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