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

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

Я разрабатываю приложение на основе 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.

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

4b9b3361

Ответ 1

Также в 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 должен превышать 12 MaxRequestSize.

Ответ 3

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

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

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

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

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

Ответ 4

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

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

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

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

Ответ 5

Существует некоторая разница, когда мы определяем свойства в 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 загрузка 1.4

Ответ 6

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

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

Ответ 9

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

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

Ответ 10

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

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

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

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

Но после исправления application.properties, при загрузке файлa > 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;

Ответ 11

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

multipart.max-file-size=10MB

Ответ 12

Если вы получаете сообщение об ошибке "сброс соединения", проблема может заключаться в атрибуте maxSwallowSize коннектора Tomcat по умолчанию, добавленном из 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" />

Ответ 13

Ни одна из указанных выше конфигураций не работала для меня с приложением 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

Ответ 14

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

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

Ответ 15

поместите это в файл application.yml, чтобы разрешить загрузку файлов размером до 900 МБ

server:
  servlet:
    multipart:
      enabled: true
      max-file-size: 900000000  #900M
      max-request-size: 900000000

Ответ 16

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