Отправить полученный весенний FilePart без сохранения

Мне нужно отправить FilePart, полученный в RestController, в API с помощью WebClient, как я могу это сделать?

Нашел пример, который сохраняет образ на диск.

private static String UPLOAD_ROOT = "C:\\pics\\";

public Mono<Void> checkInTest(@RequestPart("photo") Flux<FilePart> photoParts,
                              @RequestPart("data") CheckInParams params, Principal principal) {
    return saveFileToDisk(photoParts);
}

private Mono<Void> saveFileToDisk(Flux<FilePart> parts) {
    return parts
            .log("createImage-files")
            .flatMap(file -> {
                Mono<Void> copyFile = Mono.just(Paths.get(UPLOAD_ROOT, file.filename()).toFile())
                        .log("createImage-picktarget")
                        .map(destFile -> {
                            try {
                                destFile.createNewFile();
                                return destFile;
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        })
                        .log("createImage-newfile")
                        .flatMap(file::transferTo)
                        .log("createImage-copy");

                return Mono.when(copyFile)
                        .log("createImage-when");
            })
            .log("createImage-flatMap")
            .then()
            .log("createImage-done");
}

Затем прочтите его еще раз и отправьте на другой сервер

.map(destFile -> {
        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        try {
            map.set("multipartFile", new ByteArrayResource(FileUtils.readFileToByteArray(destFile)));
        } catch (IOException ignored) {
        }
        map.set("fileName", "test.txt");
        WebClient client = WebClient.builder().baseUrl("http://localhost:8080").build();

        return client.post()
                .uri("/upload")
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .syncBody(map)
                .exchange(); //todo handle errors???
    }).then()

Есть ли способ избежать сохранения файла?

Вы когда-нибудь находили для этого решение?

Gavin 24.09.2020 09:43

Попробуйте с этим решением, у меня работает stackoverflow.com/questions/62545577/…

srd98 10.02.2021 01:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
1 071
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Упомяну решение от @Abhinaba Chakraborty
предусмотрено в https://stackoverflow.com/a/62745370/4551411

Probably something like this:

  @PostMapping(value = "/images/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  public Mono<ResponseEntity<Void>> uploadImages(@RequestPart("files") Flux<FilePart> fileParts) {
    return fileParts
        .flatMap(filePart -> {
          return webClient.post()
              .uri("/someOtherService")
              .body(BodyInserters.fromPublisher(filePart.content(), DataBuffer.class))
              .exchange()
              .flatMap(clientResponse -> {
                //some logging
                return Mono.empty();
              });
        })
        .collectList()
        .flatMap(response -> Mono.just(ResponseEntity.accepted().build()));
  }

This accepts MULTIPART FORM DATA where you can attach multiple image files and upload them to another service.

Другие вопросы по теме