SpringBoot @MultipartConfig maxFileSize не вступает в силу

У меня есть контроллер с аннотацией 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";
    }
}

Однако, когда я загружаю файл в эту конечную точку, он, по-видимому, использует значения параметров multipart config по умолчанию:

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 аннотация @MultipartConfig в силу?

Ответ 1

Если вы просто хотите управлять многочастными свойствами, вы можете использовать свойства multipart.max-file-size и multipart.max-request-size. Например, вы можете увеличить максимальный размер до 100Mb, добавив следующие фрагменты конфигураций в файл application.properties:

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

Значения могут использовать суффиксный MB или KB чтобы указать размер мегабайта или килобайта.

Под капотом Spring Boot создаст элемент MultipartConfigElement на основе MultipartProperties и что MultipartConfigElement будет использоваться в регистрации сервлета, как указано в документации Spring MVC. Для получения дополнительной информации вы можете ознакомиться с документацией MultipartAutoConfiguration и DispatcherServletConfiguration и Checkout Spring Boot.

Ответ 2

С весенней загрузкой 1.5.3 вы должны использовать следующий код в application.yml

spring:
 http:
  multipart:
   max-file-size: 100MB
   max-request-size: 100MB

Обязательно используйте пробелы и не вставляйте свой файл yaml.

Ответ 3

С Spring Boot 2.0 вы должны использовать это в своем приложении application.yml

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

Из документации:

Spring Boot поддерживает API-интерфейс Servlet 3 javax.servlet.http.Part для поддержки загрузки файлов. По умолчанию Spring Boot настраивает Spring MVC с максимальным размером 1 МБ на файл и максимум 10 МБ данных файла в одном запросе. Вы можете переопределить эти значения, местоположение, в котором хранятся промежуточные данные (например, в каталог /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" для указания мегабайт или килобайт соответственно.

Ответ 4

Для установки пользовательских лимитов для многостраничных загрузок используются следующие свойства (для размера выборки 30 МБ):

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

Из документов (v1.4.0):

Spring Boot поддерживает API-интерфейс Servlet 3 javax.servlet.http.Part для поддержки загрузки файлов. По умолчанию Spring Boot настраивает Spring MVC с максимальным файлом 1 МБ на файл и максимум 10 МБ данных файла в одном запросе. Вы можете переопределить эти значения, а также местоположение, в котором хранятся промежуточные данные (например, в каталоге /tmp), и порог, через который данные удаляются на диск, используя свойства, выставленные в классе MultipartProperties. Если вы хотите указать, что файлы не ограничены, например, установите для spring.http.multipart.max-file-size значение -1.

Многопользовательская поддержка полезна, когда вы хотите получать данные с несколькими @RequestParam виде параметра @RequestParam -annotated типа MultipartFile в методе обработчика контроллера Spring MVC.

Те же документы для версии 1.3.8:

Если вы хотите указать, что файлы не ограничены, например, установите для свойства multipart.maxFileSize значение -1.

Ответ 5

Для Spring Boot v2+ добавьте следующее в application.properties:

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

Ответ 6

При развертывании, когда значения вставляются с помощью скрипта jenkins, "-" не допускается. Использование:

env:
  - name: SPRING_SERVLET_MULTIPART_MAXREQUESTSIZE
    value: "10MB"
  - name: SPRING_SERVLE
    value: "10MB"

Ответ 7

Свойство приложения является одним из вариантов. Другой вариант

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