#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 файла. есть идеи, как применить ограничение для каждой конечной точки, а не как общее правило?