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();
}