如何使用Flux <DataBuffer>从响应读取大文件?

时间:2019-12-08 19:38:33

标签: java spring-boot reactive-programming spring-webflux spring-webclient

在我的项目中,需要从外部服务下载文件并将其存储在某个路径中。因此,我在春季使用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(),但是我无法将内容写到文件中。 还是有其他方法可以达到相同目的?

0 个答案:

没有答案