Как загрузить файл с помощью веб-клиента Spring 5

#java #spring-boot #webclient #reactor

#java #spring-boot #веб-клиент #реактор

Вопрос:

Я пытаюсь загрузить файлы с помощью WebClient Spring5 (multipart / form-data), но я получил 400 неверных запросов, есть мой код (когда я пытаюсь с помощью RestTemplate, все работает нормально), не понимаю, почему не работает с webclient, любая помощь ценна, заранее спасибо…

 MultipartBodyBuilder builder = new MultipartBodyBuilder();

builder.part("subject", parametres.getSubject());

builder.part("lifetime", parametres.getLifeTime());

builder.part("comment", parametres.getComment());

builder.part("encrypted", parametres.getEncrypted());

builder.part("file", new FileSystemResource(file)).filename(file.getName()) //file is a java.io.File`
ClientResponse response = getClient().post()
     .uri("/messages")
     .body(BodyInserters.fromMultipartData(builder.build()))
     .header(PlinePlexHeaderEnum.HTTP_HEADER_PROCURATION_USER_ID.value(), idUser))
     .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
     .exchange().block();
  

Ответ №1:

Попробуйте это:

   final WebClient webClient = webClientBuilder.build();
        webClient.post()
            .uri("http://hostname:port/messages")
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .header(PlinePlexHeaderEnum.HTTP_HEADER_PROCURATION_USER_ID.value(), idUser))
            .body(BodyInserters.fromMultipartData(buildMultipartBody(file, parametres)))
            .retrieve()
            .bodyToMono(String.class)
            .block();
        }

        private MultiValueMap < String, HttpEntity << ? >> buildMultipartBody(private File file, private Parametres parametres) {
            MultipartBodyBuilder builder = new MultipartBodyBuilder();
            builder.part("file", new FileSystemResource(file));
            builder.part("subject", parametres.getSubject());       `
            builder.part("lifetime", parametres.getLifeTime());`
            builder.part("comment", parametres.getComment());   `
            builder.part("encrypted", parametres.getEncrypted());`
            return builder.build();
        }
  

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

1. спасибо, Мас. для ответа я попробовал ваше предложение, но я получаю 400 неверных запросов

2. Я хочу использовать то же решение в моем случае… кто-нибудь может подтвердить (@M.Mas или @kakabali), является ли это рабочим soln или нет.