【问题标题】:Spring WebClient download and upload fileSpring WebClient 下载和上传文件
【发布时间】:2021-09-30 13:17:50
【问题描述】:

我需要创建一个从 API 端点下载文件并将其上传到另一个 API 端点的进程。该文件的最大大小为 100MB,但我们将有许多进程并行运行。我正在尝试使用 Spring WebClient 来实现它,而不是将文件存储在内存中。当前代码将文件存储在内存中,因为带有大文件的测试会抛出 OutOfMemoryError。

复制方法

public Mono<SyncStatusType> copy(Strin path1, String path2) {
    
    return this.download(path1)
        .collectList()
        .flatMap(dataBuffers -> 
            this.upload(path2, Mono.just(dataBuffers).flatMapMany(Flux::fromIterable)))
        .map(item -> SyncStatusType.SUCCESSFUL);
}

下载方法

private Flux<DataBuffer> download(String path) {

    return this.getWebClient()
        .get()
        .uri(uriBuilder -> uriBuilder
            .path(path)
            .build())
        .retrieve()
        .bodyToFlux(DataBuffer.class);

}

上传方式

private Mono<CustomFileDto> upload(String path, Flux<DataBuffer> dataBuffer) {
        
    return this.getWebClient()
        .put()
        .uri(uriBuilder -> uriBuilder
            .path(path)
            .build())
        .contentType(MediaType.APPLICATION_JSON)
        .body(BodyInserters.fromDataBuffers(dataBuffer))
        .retrieve()
        .bodyToMono(CustomFileDto.class)
    }

如何修改此代码使其不在内存中存储文件内容?

【问题讨论】:

    标签: spring-webflux spring-webclient


    【解决方案1】:

    我有一个 Spring WebFlux 多部分示例,其中包含上传/下载文件并将它们存储在 Mongo GridFS 中,请查看 complete codes on my Github

    testing codes 演示了来自 WebFlux 客户端的交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 2020-07-28
      • 1970-01-01
      • 2021-03-07
      • 2021-01-19
      • 1970-01-01
      • 2021-02-09
      相关资源
      最近更新 更多