Подтвердить что ты не робот

Увеличить HTTP-сообщение maxPostSize в Spring Загрузка

У меня довольно простое Spring загрузочное веб-приложение, у меня есть одна HTML-страница с формой с enctype="multipart/form-data". Я получаю эту ошибку:

В запросе с несколькими частями содержатся данные параметров (за исключением загруженных файлов), которые превышают предел для maxPostSize, установленного на соответствующем соединителе.

Я использую Spring загруженный по умолчанию сервер tomcat. По-видимому, значение по умолчанию maxPostSize равно 2 мегабайтам. Есть ли способ редактировать это значение? Сделать это с помощью application.properties было бы лучше, вместо того, чтобы создавать настраиваемые beans или беспорядок с XML файлами.

4b9b3361

Ответ 1

Найден решение. Добавьте этот код в тот же класс, что и SpringApplication.run.

// Set maxPostSize of embedded tomcat server to 10 megabytes (default is 2 MB, not large enough to support file uploads > 1.5 MB)
@Bean
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
    return (ConfigurableEmbeddedServletContainer container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(
                (connector) -> {
                    connector.setMaxPostSize(10000000); // 10 MB
                }
            );
        }
    };
}

Изменить: Очевидно, добавление этого в файл application.properties также увеличивает maxPostSize, но я не пробовал его сам, поэтому не могу подтвердить.

multipart.maxFileSize=10Mb # Max file size.
multipart.maxRequestSize=10Mb # Max request size.

Ответ 2

В файле application.properties напишите это:

# Max file size.
spring.http.multipart.max-file-size=1Mb
# Max request size.
spring.http.multipart.max-request-size=10Mb

Отрегулируйте размер в соответствии с вашими потребностями.

Обновить

Примечание. Начиная с Spring Boot 2, теперь вы можете делать

# Max file size.
spring.servlet.multipart.max-file-size=1MB
# Max request size.
spring.servlet.multipart.max-request-size=10MB

Приложение А. Общие свойства приложения - Spring

Ответ 3

Если вы используете в своих запросах POST использование медиатипа x-www-form-urlencoded (как и я), свойство multipart Spring-boot не работает. Если ваше приложение весенней загрузки также запускает tomcat, вам нужно установить следующее свойство в файле application.properties:

# Setting max size of post requests to 6MB (default: 2MB)
server.tomcat.max-http-post-size=6291456

Я не мог найти эту информацию нигде в документации весенней загрузки. Надеюсь, это поможет любому, кто также придерживается кодировки тела в формате x-www-form-urlencoded.

Ответ 4

из документации: https://spring.io/guides/gs/uploading-files/

Настройки загрузки файлов

При настройке загрузки файлов часто бывает полезно установить ограничения на размер файлов. Представьте, что вы пытаетесь обработать файл размером 5 ГБ! С помощью Spring Boot мы можем настроить его автоматически настроенный MultipartConfigElement с некоторыми настройками свойств.

Добавьте следующие свойства в существующие src/main/resources/application.properties:

spring.http.multipart.max-file-size=128KB

spring.http.multipart.max-request-size=128KB

Составные параметры ограничены следующим образом:

  • spring.http.multipart.max-file-size is set to 128KB, что означает, что общий размер файла не может превышать 128 КБ.

  • spring.http.multipart.max-request-size имеет значение 128 КБ, что означает, что общий размер запроса для данных multipart/form-data не может превышать 128 КБ.

Ответ 5

Существует некоторая разница, когда мы определяем свойства в application.yaml и application.properties.

В 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 boot 1.4

Ответ 6

Сначала убедитесь, что вы используете spring.servlet вместо spring.http.

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

Если вам нужно использовать tomcat, вы можете создать EmbeddedServletContainerCustomizer, что не очень приятно делать.

Если вы можете жить без томата, вы можете заменить tomcat, например. взяться за и избежать этой проблемы.

Ответ 7

Применение настроек для Tomcat и сервлета

Вы можете установить максимальный размер сообщения для Tomcat в application.properties, который устанавливается с помощью int, как показано ниже. Простая настройка spring.servlet.multipart.max-request-size=10MB, как и в некоторых других ответах, может быть недостаточной.

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
server.tomcat.max-http-post-size=100000000
server.tomcat.max-swallow-size=100000000

Работа с Spring Boot 2.0.5.RELEASE

Ответ 8

Ни одно из решений не сработало для меня, и большинство из них являются просто оффтопами, потому что OP говорит о maxPostSize, а не maxFileSize (последний в любом случае выдает другую ошибку, если размер превышен)

Решение: в /tomcat/conf/server.xml добавьте атрибут maxPostSize = "" в Connector

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxPostSize="10485760"
           redirectPort="8443" />

Ответ 10

Для меня ничего из предыдущих работ (возможно, использование приложения с yaml - проблема здесь), но воспользуйтесь этим вопросом:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@ServletComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofBytes(512000000L));
        factory.setMaxRequestSize(DataSize.ofBytes(512000000L));
        return factory.createMultipartConfig();
    }
}