Как вернуть файл, загруженный в качестве буфера данных

#spring #spring-boot #spring-webflux #project-reactor

Вопрос:

Я загружаю файл, как показано ниже:

 private File downloadAndReturnFile(String fileId, String destination) {
    log.info("Downloading file.. "   fileId);
    Path path = Paths.get(destination);
    Flux<DataBuffer> dataBuffer = webClient.get().uri("/the/download/uri/"   fileId   "").retrieve()
            .bodyToFlux(DataBuffer.class)
            .doOnComplete(() -> log.info("{}", fileId   " - File downloaded successfully"));
    
    //DataBufferUtils.write(dataBuffer, path, StandardOpenOption.CREATE).share().block();
    
    return ???? // What should I do here to return above DataBuffer as file? 
}
 

Как я могу вернуть буфер данных в виде файла? Или как я могу преобразовать этот буфер данных в файловый объект?

Ответ №1:

Вы могли бы использовать DataBufferUtils.write метод. Для этого вам следует

  1. создайте экземпляр File объекта (возможно, используя fileId и destination ), который также является возвращаемым значением, которое вы хотите
  2. создайте OutputStream объект или Path или Channel s из объекта File
  3. позвоните DataBufferUtils.write(dataBuffer, ....).share().block() , чтобы записать DataBuffer в файл

а именно (все выданные исключения опущены),

 ...
File file = new File(destination, fileId);
Path path = file.toPath();
DataBufferUtils.write(dataBuffer, path, StandardOpenOption.CREATE).share().block();
return file;
 

Или,

 ...
Path path = Paths.get(destination);
DataBufferUtils.write(dataBuffer, path, StandardOpenOption.CREATE).share().block();
return path.toFile();
 

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

1. Не могли бы вы, пожалуйста, ввести для этого псевдокод? Извини за глупость.

2. Не могли бы вы указать реальное значение destination переменной и путь uri для загрузки? Я могу загрузить в файл, используя код.

3. это то, что у меня есть в качестве пункта назначения (строка) — c:/aap/test01.pdf . Прокомментированная строка моего исходного вопроса записывается в файл без каких-либо проблем.

4. Чтобы извлечь File объект из Path объекта, вы можете просто использовать Path.toFile() метод. Если ваш исходный код успешно записывает содержимое в файл, вы можете return path.toFile(); это сделать . Мне жаль, что я не нахожусь в среде Windows, поэтому я не уверен, следует ли создавать File объектную среду Windows, отличную от Linux.

5. Ах … моя вина. Я создал копию метода и все еще вызывал неправильный метод. Все работает так, как и ожидалось. Могу сказать достаточно спасибо @Tonny. Принимая его с широкой улыбкой. !

Ответ №2:

На случай, если кто-то ищет полный код. Просто делюсь решением Тонни в полной мере.

 private File downloadAndReturnFile(String fileId, String destination) throws FileNotFoundException {
            log.info("Downloading file.. "   fileId);
            Flux<DataBuffer> dataBuffer = webClient.get().uri("/the/download/uri/"   fileId   "").retrieve()
                    .bodyToFlux(DataBuffer.class)
                    .doOnComplete(() -> log.info("{}", fileId   " - File downloaded successfully"));
            Path path = Paths.get(destination);
            DataBufferUtils.write(dataBuffer, path, StandardOpenOption.CREATE).share().block();
            return path.toFile();
        }