在我的项目中,需要从外部服务下载文件并将其存储在某个路径中。因此,我在春季使用RestTemplate
将文件下载为Byte []。但是,此操作使我消耗了内存。我在这个博客https://inneka.com/programming/spring/spring-webclient-how-to-stream-large-byte-to-file/中发现了有关使用spring webClient并将文件写入path的信息。由于我关注的文件是使用APPLICATION_OCTET_STREAM
的音频文件im。以下代码的问题不起作用。我对反应式编程非常陌生,对此的任何提示都会有所帮助。
public Mono<void> testWebClientStreaming(String filename, String format) throws IOException {
WebClient webClient = WebClient.create("https://stackoverflow.com");
String username = "Username";
String token = "Password";
String path = DOWNLOAD_TEMP_PATH + PATH_SEPERATOR + filename +"."+ format;
Flux<DataBuffer> stream = webClient
.get()
.uri("/files/{filename}.{format}",
filename, format)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.header("Authorization", "Basic " + Base64Utils.encodeToString((username + ":" + token).getBytes(UTF_8)))
.retrieve()
.bodyToFlux(DataBuffer.class);
return DataBufferUtils.write(stream, asynchronousFileChannel)
.doOnComplete(() -> System.out.println("\n\n\n\n\n\n FINISHED "))
.doOnNext(DataBufferUtils.releaseConsumer())
.doAfterTerminate(() -> {
try {
asynchronousFileChannel.close();
} catch (IOException ignored) { }
}).then();
}
我尝试了exchange()
,而不是retrive()
,但是我无法将内容写到文件中。
还是有其他方法可以达到相同目的?