SpringBoot的@MultipartConfig maxFileSize没有生效

时间:2016-04-29 18:46:24

标签: java spring spring-mvc spring-boot

我有一个带有MultipartConfig注释的控制器(其片段如下所示):

@RestController
@RequestMapping("packages")
@MultipartConfig(maxFileSize = 1024*1024*1024, maxRequestSize = 1024*1024*1024)
public class PackagesController
{
    @RequestMapping(method = RequestMethod.POST)
    public String create(@RequestParam("package") MultipartFile uploadedPackage)
    {
        // do stuff to the file
        return "create";
    }
}

但是,当我将文件上传到此端点时,它似乎使用默认的多部分配置值:

Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field package exceeds its maximum permitted size of 1048576 bytes.
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:633) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:1.8.0_45]
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:293) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    at org.apache.catalina.connector.Request.parseParts(Request.java:2776) ~[tomcat-embed-core-8.0.32.jar:8.0.32]
    ... 30 common frames omitted

我的应用程序如下所示:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }

}

我是否遗漏了一些允许@MultipartConfig注释生效的内容?

7 个答案:

答案 0 :(得分:24)

使用spring-boot 1.5.3,您应该在application.yml

中使用以下代码
spring:
 http:
  multipart:
   max-file-size: 100MB
   max-request-size: 100MB

确保在yaml文件中使用空格而不是制表符。

答案 1 :(得分:23)

使用Spring Boot 2.0,您应该在application.yml

中使用它
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

来自documentation

  

Spring Boot包含Servlet 3 javax.servlet.http.Part API以支持上传文件。默认情况下,Spring Boot在单个请求中配置Spring MVC,每个文件的最大大小 1MB ,最大 10MB 的文件数据。您可以覆盖这些值,存储中间数据的位置(例如,到/tmp目录),以及使用MultipartProperties中公开的属性将数据刷新到磁盘的阈值。类。例如,如果要指定文件不受限制,请将 spring.servlet.multipart.max-file-size 属性设置为-1

摘自Appendix A of documentation

  

spring.servlet.multipart.max-file-size = 1MB #最大文件大小。值可以使用后缀“MB”或“KB”分别表示兆字节或千字节。

     

spring.servlet.multipart.max-request-size = 10MB #最大请求大小。值可以使用后缀“MB”或“KB”分别表示兆字节或千字节。

答案 2 :(得分:19)

要设置分段上传的自定义限制,请使用以下属性(样本大小为30MB):

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

在我们公司的项目中,我发现其中一个是在Spring Boot 1.3.5版本上,所以对于版本< 1.4你应该使用

multipart.max-file-size=30MB
multipart.max-request-size=30MB

来自docs(v1.4.0)

  

Spring Boot包含Servlet 3 javax.servlet.http.Part API   支持上传文件。默认情况下,Spring Boot配置Spring MVC   最大文件为每个文件1MB,最大文件数据为10MB   在一个请求中。您可以覆盖这些值,以及   存储中间数据的位置(例如,/tmp   目录)和数据刷新到磁盘的阈值   使用MultipartProperties类中公开的属性。如果你   想要指定文件是无限制的,例如,设置   spring.http.multipart.max-file-size属性-1

     

当您想要接收多部分时,多部分支持非常有用   编码的文件数据为@RequestParam - 带注释的类型参数   Spring MVC控制器处理程序方法中的MultipartFile

版本1.3.8的相同文档:

  

如果要指定文件不受限制,例如,请设置   multipart.maxFileSize属性-1

答案 3 :(得分:18)

如果您只想控制多部分属性,可以使用multipart.max-file-sizemultipart.max-request-size属性。例如,您可以通过在100Mb文件中添加以下配置来将最大尺寸提高到application.properties

multipart.max-file-size=100MB
multipart.max-request-size=100MB

值可以使用后缀MBKB来表示 Megabyte Kilobyte 大小。

在引擎盖下,Spring Boot将根据MultipartConfigElement创建MultipartPropertiesMultipartConfigElement将用于Servlet注册,如Spring MVC documentation中所述。您可以查看MultipartAutoConfigurationDispatcherServletConfiguration以及结帐Spring Boot documentation了解详情。

答案 4 :(得分:7)

对于Spring Boot v2 +,将以下内容添加到application.properties:

client.on('voiceStateUpdate', (oldMember, newMember) => {
  let oldChannel = oldMember.voiceChannel, // the previous channel, if there was one
    newChannel = newMember.voiceChannel; // the current channel, if there is one

  if (oldChannel != newChannel) { // if the channel has changed
    // do your stuff...
  }
});

答案 5 :(得分:0)

在部署中,通过jenkins脚本插入值时,不允许使用“-”。使用:

--no-sandbox

答案 6 :(得分:0)

应用程序属性是一种选择。另一个选择是

@Bean
public MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
  factory.setMaxFileSize("10MB");
  factory.setMaxRequestSize("10MB");
  return factory.createMultipartConfig();
}