Spring WebFlux: установите максимальный размер файла (ов) для загрузки файлов

#java #spring-boot #spring-webflux

#java #spring #файл-загрузка #загрузка #spring-webflux

Вопрос:

Я использую поток файловых частей для загрузки файлов @RequestPart(FILES) Flux<FilePart> files

И пытаюсь ограничить максимальный размер файлов. Похоже, старый способ не работает:

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

И у меня нет никаких методов для получения размера файла в FilePart интерфейсе. Итак, есть ли какой-либо способ ограничить максимальный размер загружаемого файла в webflux без его копирования? Я знаю, что есть такие заголовки, как Content-Length , но это не выглядит безопасным способом.

Ответ №1:

В документации Web on Reactive Stack указано следующее:

Для частей файла, записанных на диск, существует дополнительное свойство maxDiskUsagePerPart для ограничения объема дискового пространства для каждой части. Существует также свойство maxParts для ограничения общего количества частей в составном запросе. Чтобы настроить все 3 в WebFlux, вам необходимо предоставить предварительно настроенный экземпляр MultipartHttpMessageReader в ServerCodecConfigurer.

Я смог применить его с помощью этого класса конфигурации:

 @Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        SynchronossPartHttpMessageReader partReader = new SynchronossPartHttpMessageReader();
        partReader.setMaxParts(1);
        partReader.setMaxDiskUsagePerPart(10L * 1024L);
        partReader.setEnableLoggingRequestDetails(true);

        MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(partReader);
        multipartReader.setEnableLoggingRequestDetails(true);

        configurer.defaultCodecs().multipartReader(multipartReader);
    }

}
  

Комментарии:

1. Обратите внимание, что ограничение setMaxParts(), к сожалению, также применяется к полям формы, а не только к файлам.

2. Также обратите внимание, что в показанной конфигурации используется программа чтения деталей Synchronoss вместо DefaultPartHttpMessageReader : docs.spring.io/spring-framework/docs/current/javadoc-api/org /…

3. Как установить максимальные параметры для отдельных конечных точек. Скажем, у меня есть и API, который должен загружать только до 3 файлов, и другой API, который принимает 2 части запроса в виде строки и до 5 файлов для загрузки? если вы используете setMaxParts(3), то второй API не разрешает загружать более 1 файла. есть идеи, как применить ограничение для каждой конечной точки, а не как общее правило?