Как установить максимальный размер загружаемого файла

Я разрабатываю приложение на основе Spring Boot и AngularJS с использованием JHipster. Мой вопрос, как установитьмаксимальный размер загружаемых файлов?

Если я пытаюсь загрузить в большой файл, я получаю эту информацию в консоли:

  DEBUG 11768 --- [io-8080-exec-10] c.a.app.aop.logging.LoggingAspect: 

Enter: com.anuglarspring.app.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] = 

[org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: 

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]

И ответ сервера со статусом 500.

Как установить это?

Ответы на вопрос(14)

вы можете воспользоваться помощью аргументов VM, как я использовал в Spring 1.5.8.RELEASE:

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb
 Khushboo Sharma16 нояб. 2018 г., 12:58
Аргументы VM могут переопределять значения, указанные в application.yml

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

В application.yml:

spring:
    http:
      multipart:
       max-file-size: 256KB
       max-request-size: 256KB

И в приложении. Свойства:

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

Примечание: Spring версия 4.3 и Spring boot 1.4

которое отлично сработало для меня.

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

Ref:https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html

Я знаю, что это очень поздно для игры, но я хотел опубликовать дополнительную проблему, с которой я столкнулся при использовании mysql, если кто-то столкнется с той же проблемой в будущем.

Как некоторые из ответов, упомянутых выше, установка их в application.properties в основном решит проблему

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

Я устанавливаю его на 16 МБ, потому что я использую тип данных mysql MEDIUMBLOB для хранения файла.

Но после исправления application.properties, при загрузке файла> 4MB выдает ошибку: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [вставить в test_doc (doc_id, duration_of_doc, doc_version_id, file_name, doc) значения (?,?,?,?,?)]; Слишком большой пакет для запроса (6656781> 4194304). Вы можете изменить это значение на сервере, установив переменную max_allowed_packet '.; вложенное исключение - com.mysql.jdbc.PacketTooBigException: слишком большой пакет для запроса (6656781> 4194304). Вы можете изменить это значение на сервере, установив переменную max_allowed_packet '.

Итак, я запустил эту команду из mysql:

SET GLOBAL max_allowed_packet = 1024*1024*16;

Ни одна из указанных выше конфигураций не работала для меня с приложением Spring.

Реализация этого кода в основномприложение класс (аннотированный @SpringBootApplication) сделал свое дело.

@Bean 
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
     return (ConfigurableEmbeddedServletContainer container) -> {

              if (container instanceof TomcatEmbeddedServletContainerFactory) {

                  TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                  tomcat.addConnectorCustomizers(
                          (connector) -> {
                              connector.setMaxPostSize(10000000);//10MB
                          }
                  );
              }
    };
}

Вы можете изменить принятый размер в выписке:

connector.setMaxPostSize (10000000); // 10MB

Более конкретно, в вашемapplication.yml В конфигурационный файл добавьте следующее в раздел «spring:».

http:
    multipart:
        max-file-size: 512MB
        max-request-size: 512MB

Пробелы важны, и вынельзя использовать вкладки для отступа.

 geraldhumphries28 дек. 2016 г., 19:15
Если это свойство должно быть установлено как в dev, так и в prod, просто добавьте его вapplication.yml приведет к каскадному подключению к обоим профилям, поэтому вам не нужно устанавливать его дважды.

Для Spring Boot 2. + убедитесь, что вы используетеspring.servlet вместоspring.http.

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

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

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

 Gian08 мая 2018 г., 11:49
Совпадающие #SWiggels. Использование spring.servlet ... для тех, кто работает с версией> 1.5.9.
 SWiggels07 мая 2018 г., 11:12
или же:spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
 bluelabel01 февр. 2018 г., 00:38
изменение spring.servlet было введено в весенней загрузке 2+, стоит отредактировать ваш ответ, как это было раньше (весенняя загрузка <= 1.5.9) spring.http.multipart

Если вы получаете сообщение об ошибке «сброс соединения», возможно, проблема в соединителе Tomcat по умолчаниюmaxSwallowSize атрибут добавлен из Tomcat 7.0.55 (ChangeLog)

ОтСправочник по настройке Apache Tomcat 8

maxSwallowSize: Максимальное количество байтов тела запроса (исключая издержки кодировки передачи), которые Tomcat проглотит для прерванной загрузки. Прерванная загрузка - это когда Tomcat знает, что тело запроса будет проигнорировано, но клиент все равно отправит его. Если Tomcat не проглотит тело, клиент вряд ли увидит ответ. Если не указан, будет использоваться значение по умолчанию 2097152 (2 мегабайта). Значение меньше нуля указывает, что ограничение не должно применяться.

Для Springboot встроенного Tomcat объявить TomcatEmbeddedServletContainerFactory

Java 8:

@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
        if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
            //-1 for unlimited
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
        }
    });
    return tomcat;
}

Java 7:

@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer()  {
        @Override
        public void customize(Connector connector) {
            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                //-1 for unlimited
                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        }
    });
    return tomcat;
}

Или в Tomcat / conf / server.xml для 5 МБ

<Connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="8443"
       maxSwallowSize="5242880" />

Вам нужно установитьmultipart.maxFileSize а такжеmultipart.maxRequestSize параметры к более высоким значениям, чем по умолчанию. Это можно сделать в файлах конфигурации весенней загрузки yml. Например, добавив следующее кapplication.yml позволит пользователям загружать файлы размером 10 МБ:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

Если пользователь должен иметь возможность загружать несколько файлов за один запрос, и они могут занимать более 10 МБ, вам необходимо настроитьmultipart.maxRequestSize на более высокое значение:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

Источник:https://spring.io/guides/gs/uploading-files/

 AndreLDM21 сент. 2016 г., 17:01
@tibi, если вы используете Sprint Boot 1.4.x, проверьте ответ веб-мастера, потому что это свойство изменилось.
 tibi14 авг. 2016 г., 17:02
я добавил это: http: multipart: maxFileSize: 100Mb maxRequestSize: 100Mb к весеннему разделу, но это не помогло.

Вspring 2.x , Варианты изменились незначительно. Таким образом, приведенные выше ответы являются почти правильными, но не полностью. В вашемapplication.properties файл, добавьте следующее-

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

Весной Boot 2spring.http.multipart изменился наspring.servlet.multipart

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#multipart-configuration

 BlackTea21 июл. 2017 г., 16:40
Благослови вас, сэр!
 kmar akrout01 авг. 2019 г., 17:53
ты спас мой день!

Также в Spring boot 1.4 вы можете добавить следующие строки в ваш application.properties, чтобы установить ограничение размера файла:

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

Работал на меня. Источник:https://spring.io/guides/gs/uploading-files/

ОБНОВИТЬ:

Кто-то спросил разницу между двумя свойствами.

Ниже приведены формальные определения:

MaxFileSize: максимально допустимый размер загружаемых файлов в байтах. Если размер любого загруженного файла больше этого размера, веб-контейнер сгенерирует исключение (IllegalStateException). Размер по умолчанию не ограничен.

MaxRequestSize: максимальный размер, разрешенный для запроса multipart / form-data, в байтах. Веб-контейнер выдаст исключение, если общий размер всех загруженных файлов превысит этот порог. Размер по умолчанию не ограничен.

Чтобы объяснить каждый:

MaxFileSize:Ограничение на один файл для загрузки, Это применяется только для ограничения одного файла.

MaxRequestSize:Ограничение на общий размер всех файлов в одном запросе на загрузку, Это проверяет общий лимит. Допустим, у вас есть два файлаa.txt а такжеb.txt для одного запроса на загрузку.a.txt является5кб а такжеb.txt является7Кб ИтакMaxRequestSize должно быть выше12KB.

 ZhaoGang30 окт. 2018 г., 04:51
работает в загрузке 2.0.5.
 Nagaraja JB28 мая 2018 г., 17:22
Я использовал ниже весной загрузки 2.0.1spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
 Arun Gowda16 нояб. 2018 г., 11:34
В чем разница междуmax-file-size а такжеmax-request-size?
 Bahadir Tasdemir21 нояб. 2018 г., 09:09
max-file-size -> Максимальный размер одного файла для загрузки.max-request-size -> ограничение общего размера всех файлов в одном запросе на загрузку. Так; если вы хотите увеличить размер загрузки, вы должны увеличить оба значения, потому что одно относится к ограничению одного файла, а другое - к общему размеру всех файлов в одном запросе.

я используюspring-boot-1.3.5.RELEASE и у меня была такая же проблема. Ни одно из вышеперечисленных решений не сработало для меня. Но, наконец, добавив следующее свойствоapplication.properties была исправлена ​​проблема.

multipart.max-file-size=10MB
 Vijay Shegokar24 янв. 2019 г., 11:18
Спасибо чувак. Вы спасли мою жизнь.

Эти свойства в весенней загрузке application.properties делают допустимый размер файла неограниченным -

# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1

Ваш ответ на вопрос