#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
метод. Для этого вам следует
- создайте экземпляр
File
объекта (возможно, используяfileId
иdestination
), который также является возвращаемым значением, которое вы хотите - создайте
OutputStream
объект илиPath
илиChannel
s из объектаFile
- позвоните
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();
}