Загрузка файла с помощью Spring Webclient, файл пуст - PullRequest
0 голосов
/ 14 июля 2020

Я должен загрузить ZIP-файл из стороннего API. Однако, когда я использую Spring Webclient, я получаю пустой файл. Есть идеи, что я делаю не так? Каков правильный способ сохранить содержимое Flux<DataBuffer> в файл?

Вот мой код:

WebClient client = WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient1))
            .baseUrl(String.format(FILE_DOWNLOAD_PATH))
            .build();


    WebClient.RequestBodyUriSpec method = client.method(HttpMethod.GET);
    method.header("Authorization", "Bearer " + accessToken);
    final Flux<DataBuffer> dataBufferFlux = method.retrieve().bodyToFlux(DataBuffer.class);

    final Path path = FileSystems.getDefault().getPath("example" + new Random(200).nextInt() + ".zip");

    WritableByteChannel channel = Files.newByteChannel(path, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
    Mono<Path> then = DataBufferUtils.write(dataBufferFlux, channel)
            .map(DataBufferUtils::release)
            .then(Mono.just(path));

ОБНОВЛЕНИЕ: приведенный выше код вызывается непосредственно из основного, а затем приложение закрывается. Может ли это быть проблемой?

1 Ответ

0 голосов
/ 15 июля 2020

Как упоминал @MichaelBerry, вам не хватает вызова block.

В документации метода четко указано, что:

Note that the writing process does not start until the returned Flux is subscribed to.

У меня работал код ниже:

public class MySpringBootApp {

  public static void main(String[] args) throws IOException {

    Path path = Paths.get("src/main/resources/sample.zip");
    WebClient client = WebClient.builder()
        .baseUrl("https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-zip-file.zip")
        .build();
    Flux<DataBuffer> dataBufferFlux = client.get().retrieve().bodyToFlux(DataBuffer.class);
    DataBufferUtils.write(dataBufferFlux, path, StandardOpenOption.CREATE).block(); //Creates new file or overwrites exisiting file

  }


}
...