SpringBoot的@MultipartConfig maxFileSize没有生效

Nic*_*lfe 27 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我的应用程序如下所示:

@SpringBootApplication
public class Application {

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

}
Run Code Online (Sandbox Code Playgroud)

是否有我遗漏的东西允许@MultipartConfig注释生效?

小智 29

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

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
Run Code Online (Sandbox Code Playgroud)

来自文档:

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

摘自文档附录A.

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

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


Ali*_*ani 26

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

multipart.max-file-size=100MB
multipart.max-request-size=100MB
Run Code Online (Sandbox Code Playgroud)

值可以使用后缀MBKB表示MegabyteKilobyte大小.

在引擎盖下,Spring Boot将创建一个MultipartConfigElement基于MultipartProperties,MultipartConfigElement并将用于Servlet注册,如Spring MVC文档中所述.你可以看看MultipartAutoConfiguration,并DispatcherServletConfiguration和Google Checkout 春季启动文档以获取更多信息.

  • 应该注意的是,当Spring Boot的版本低于1.4时,将使用此选项.如果它是1.4或更高,则使用另一组属性(在@ Teebo的答案中). (11认同)

tbo*_*o47 26

使用spring-boot 1.5.3,您应该在application.yml中使用以下代码

spring:
 http:
  multipart:
   max-file-size: 100MB
   max-request-size: 100MB
Run Code Online (Sandbox Code Playgroud)

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


cst*_*992 21

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

spring.http.multipart.max-file-size=30MB
spring.http.multipart.max-request-size=30MB
Run Code Online (Sandbox Code Playgroud)

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

multipart.max-file-size=30MB
multipart.max-request-size=30MB
Run Code Online (Sandbox Code Playgroud)

文档(v1.4.0):

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

当您希望在Spring MVC控制器处理程序方法中接收多部分编码文件数据作为@RequestParam类型的注释参数 时,多部分支持很有用MultipartFile.

版本1.3.8的相同文档:

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


use*_*867 11

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

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=40MB
Run Code Online (Sandbox Code Playgroud)