Як встановити максимальний розмір файлу для завантаження


83

Я розробляю додаток на основі 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.

Як це встановити?

Відповіді:


133

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

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

для весняного завантаження 2.x і вище його

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

Працював у мене. Джерело: https://spring.io/guides/gs/uploading-files/

ОНОВЛЕННЯ:

Хтось запитав різницю між двома властивостями.

Нижче наведені офіційні визначення:

MaxFileSize: максимально допустимий розмір для завантажених файлів у байтах. Якщо розмір будь-якого завантаженого файлу перевищує цей розмір, веб-контейнер видасть виняток (IllegalStateException). Розмір за замовчуванням необмежений.

MaxRequestSize: Максимальний розмір, дозволений для запиту даних із декількох частин / даних форми, у байтах. Веб-контейнер видасть виняток, якщо загальний розмір усіх завантажених файлів перевищує цей поріг. Розмір за замовчуванням необмежений.

Для пояснення кожного:

MaxFileSize: Обмеження для завантаження одного файлу . Це застосовується лише для обмеження для одного файлу.

MaxRequestSize: Обмеження загального розміру всіх файлів в одному запиті на завантаження . Це перевіряє загальний ліміт. Скажімо, у вас є два файли a.txt і b.txt для одного запиту на завантаження. a.txt є 5Кб і b.txt є 7Кб тому MaxRequestSizeповинна бути вище 12Кб .


9
Я використав нижченаведене весняне завантаження 2.0.1 spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
Nagaraja JB

1
У чому різниця між max-file-sizeі max-request-size?
Арун Гоуда,

3
max-file-size-> максимальний розмір для завантаження одного файлу. max-request-size-> обмеження загального розміру всіх файлів в одному запиті на завантаження. Так; якщо ви хочете збільшити розмір завантаження, вам доведеться збільшити обидва значення, оскільки одне - для обмеження одного файлу, а одне - загального розміру всіх файлів в одному запиті.
Бахадір Тасдемір

1
Якщо ви використовуєте Spring Boot для розробки мікросервісів, вам потрібно додати ту саму конфігурацію до служби шлюзу, щоб запобігти помилкам завантаження. Сподіваюся, це позбавить когось від неприємностей, які я пережив
АгуТадей

Як @AguThadeus запропонував розробити мікросервіс із налаштуванням шлюзу, нам також потрібно додати spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MBвластивості шлюзу
Sandeep K Nair

31

У Spring Boot 2 spring.http.multipartзмінено наspring.servlet.multipart

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


благословляю вас, сер !!
BlackTea

ти врятував мій день!
kmar akrout

Що спонукало хлопців Pivotal зробити цю зміну? Я вважаю, що це може бути накладними для весняного оновлення завантаження до Spring Boot 2.
ChandraBhan Singh 02

23

Для Spring Boot 2. + переконайтеся, що ви використовуєте spring.servletзамість spring.http.

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

Якщо вам доведеться використовувати tomcat, ви можете в кінцевому підсумку створити EmbeddedServletContainerCustomizer , що не дуже приємно робити.

Якщо ви можете жити без tomat, ви можете замінити tomcat, наприклад, undertow і взагалі уникнути цієї проблеми.


зміна spring.servlet була введена в spring boot 2+, і варто відредагувати свою відповідь, як це було раніше (spring boot <= 1.5.9) spring.http.multipart
bluelabel

або: spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
SWiggels

Погоджуючись #SWiggels. Використання spring.servlet ... для тих, хто використовує версію> 1.5.9.
Gian

21

Вам потрібно встановити для параметрів 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/


3
я додав це: http: multipart: maxFileSize: 100Mb maxRequestSize: 100Mb до весняного розділу, але це не допомогло.
тібі

2
@tibi, якщо ви використовуєте Sprint Boot 1.4.x, перевірте відповідь веб-майстра, оскільки ця властивість змінилася.
AndreLDM

15

Існує певна різниця, коли ми визначаємо властивості в application.properties та застосунку yaml.

У 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


11

В spring 2.x. Варіанти трохи змінилися. Отже, наведені вище відповіді майже правильні, але не цілком. У свій application.propertiesфайл додайте наступне -

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

6

Більш конкретно, у своєму application.ymlконфігураційному файлі додайте наступне до розділу "spring:".

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

Пробіл важливий, і ви не можете використовувати вкладки для відступу .


Якщо це властивість, яку потрібно встановити як у dev, так і у prod, просто додавши її, application.ymlвона призведе до каскаду до обох профілів, тому вам не потрібно встановлювати її двічі.
geraldhumphries

5

Ці властивості у spring завантаження application.properties роблять допустимий розмір файлу необмеженим -

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

4

Рішення я знайшов на Expert Exchange, який для мене добре працював.

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

Посилання: https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html


4

Я використовую, spring-boot-1.3.5.RELEASEі у мене була та сама проблема. Жодне з наведених вище рішень не працює для мене. Але нарешті додано наступне властивість до, application.propertiesбуло вирішено проблему.

multipart.max-file-size=10MB

2
Працював також для Spring Boot v1.2.3.ВИПУСК
DjAlan

3

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

Як і деякі з вищезгаданих відповідей, встановлення їх у застосунку application.properties здебільшого вирішить проблему

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

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

Але після виправлення application.properties, при завантаженні файлу> 4 Мб виникла помилка: 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;

3

Якщо ви отримуєте помилку "підключення скидає", проблема може полягати в атрибуті maxSwallowSize за замовчуванням Tomcat, доданому з Tomcat 7.0.55 ( ChangeLog )

З довідкового матеріалу конфігурації Apache Tomcat 8

maxSwallowSize : Максимальна кількість байтів основного запиту (за винятком накладних витрат кодування передачі), які Tomcat проковтне для перерваного завантаження. Перерване завантаження - це коли Tomcat знає, що тіло запиту буде проігноровано, але клієнт все одно надсилає його. Якщо Tomcat не проковтне тіло, клієнт навряд чи побачить відповідь. Якщо не вказано, буде використано значення за замовчуванням 2097152 (2 мегабайти). Значення менше нуля означає, що жодне обмеження не повинно застосовуватися.

Для вбудованого Tomcat Springboot оголосіть 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" />

0

Жодна з наведених вище конфігурацій не працювала для мене з додатком 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); // 10 Мб


0

Щоб уникнути цього винятку, ви можете скористатися аргументами віртуальної машини так само, як я використовував навесні 1.5.8.

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb

Аргументи ВМ можуть замінити значення, наведені в application.yml
Khushboo Sharma

0

Для мене нічого з попередніх робіт (можливо, використання програми з 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();
    }
}

-1

помістіть це у свій application.ymlфайл, щоб дозволити завантаження файлів розміром до 900 МБ

server:
  servlet:
    multipart:
      enabled: true
      max-file-size: 900000000  #900M
      max-request-size: 900000000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.