首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring WebClient:如何将大型byte[]流式传输到文件?

基础概念

Spring WebClient 是 Spring 5 引入的一个用于构建非阻塞的、响应式的 HTTP 客户端的工具。它基于 Reactor 项目,提供了强大的流式处理能力,非常适合处理大型数据传输。

相关优势

  1. 非阻塞:WebClient 是基于事件循环的非阻塞模型,能够高效处理大量并发请求。
  2. 响应式:支持响应式编程模型,可以方便地处理流式数据。
  3. 集成良好:与 Spring 生态系统中的其他组件(如 Spring Boot、Spring Security 等)集成良好。

类型

WebClient 支持多种类型的请求和响应处理,包括:

  • GET 请求
  • POST 请求
  • PUT 请求
  • DELETE 请求
  • 其他 HTTP 方法

应用场景

适用于需要处理大量数据传输的场景,如文件下载、大数据处理、实时数据流等。

流式传输大型 byte[] 到文件

以下是一个示例代码,展示如何使用 WebClient 将大型 byte[] 流式传输到文件:

代码语言:txt
复制
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;

public class WebClientFileDownload {

    public static void main(String[] args) {
        String url = "https://example.com/large-file.bin";
        Path filePath = Paths.get("downloaded-file.bin");

        WebClient webClient = WebClient.create();

        Mono<Void> download = webClient.get()
                .uri(url)
                .exchangeToFlux(response -> {
                    if (response.statusCode().equals(HttpStatus.OK)) {
                        return response.bodyToFlux(DataBuffer.class);
                    } else {
                        return Flux.error(new RuntimeException("Failed to download file"));
                    }
                })
                .doOnNext(dataBuffer -> {
                    try (FileOutputStream fos = new FileOutputStream(filePath.toFile());
                         FileChannel channel = fos.getChannel()) {
                        channel.write(dataBuffer.asByteBuffer());
                    } catch (IOException e) {
                        throw new RuntimeException("Failed to write file", e);
                    }
                })
                .doOnError(throwable -> System.err.println("Error during download: " + throwable.getMessage()))
                .then();

        download.block();
    }
}

解释

  1. 创建 WebClient 实例:使用 WebClient.create() 创建一个 WebClient 实例。
  2. 发起 GET 请求:使用 webClient.get().uri(url).exchangeToFlux() 发起 GET 请求,并将响应转换为 Flux<DataBuffer>
  3. 处理响应:检查响应状态码,如果是 200 OK,则继续处理响应体。
  4. 流式写入文件:使用 doOnNext 操作符将每个 DataBuffer 写入文件。这里使用了 FileOutputStreamFileChannel 来高效地写入文件。
  5. 错误处理:使用 doOnError 操作符处理下载过程中可能出现的错误。

参考链接

通过这种方式,可以高效地将大型 byte[] 流式传输到文件,避免内存溢出等问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

快速学习-Spring5 的新特性

应用程序构建任务可以定义当前项目自己的 META-INF/spring.components 文件。在编译时,源模型是自包含的,JPA 实体和 Spring 组件是已被标记的。...但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。 加载组件索引的耗费是廉价的。...这个对于我们处于大型 Spring 项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然 20 或者 30 秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。...Spring Framework 5.0 对于流式处理的支持依赖于 Project Reactor 来构建, 其专门实现了Reactive Streams API。...这里有一个使用 Spring 5.0 的 REST 端点的 WebClient 实现: WebClient webClient = WebClient.create(); Mono person = webClient.get

87920
  • 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    -GET请求使用方法详解 精讲RestTemplate第4篇-POST请求方法使用详解 精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解 精讲RestTemplate第6篇-文件上传下载与大文件流式下载...根据Spring官方文档及源码中的介绍,RestTemplate在将来的版本中它可能会被弃用, 作为替代,Spring官方已在Spring 5中引入了WebClient作为非阻塞式Reactive HTTP...流式传输场景 三、项目引入WebClient 使用WebClient需要引入如下的Jar(可以在包含spring-boot-starter-web的Spring Boot项目中引入) <dependency...技术栈的Spring Boot应用 spring-boot-starter-webflux可以实现的是底层基于netty的响应式编程的技术栈的Spring Boot应用 二者可以共存么?...作为HTTP客户端而言,如果我们只是要使用WebClient。无论怎样,引入spring-boot-starter-webflux就对了。

    2.4K41

    程序员如果都懂SpringWebFlux框架的话,也不用天天CRUD了

    ● 底 层 是 Web HTTP 服 务 引 擎 , Spring MVC 框 架 基 于 统 的Servlet容器,WebFlux实现了Servlet 3.1+规范的容器引擎,Servlet 3.1...如果你想修改Servlet容器的服务引擎,则需要在pom.xml文件中添加相应的容器依赖Starter包,这里每个服务引擎都会有自己独立的响应适配器(Adapter)映射HTTP请求或响应到Server...WebClient与传统的RestTemplate的主要区别在于基于函数式、响应式和流式的API,使用声明式的代码风格。同时WebClient依赖非阻塞式的编解码器来完成HTTP的请求和响应。...Spring MVC也可以使用其他响应式组件。 ● 对于大型应用程序要考虑到非阻塞方式实现业务功能的学习曲线。...如果你已经有了一个大型研发团队,还要用Spring WebFlux技术栈,就必须要权衡陡峭的学习曲线和实际的项目收益。

    2.1K20

    Spring Framework 5.0 新特性有这些

    应用程序构建任务可以定义当前项目自己的 META-INF/spring.components 文件。在编译时,源模型是自包含的,JPA 实体和 Spring 组件是已被标记的。...但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。 加载组件索引的耗费是廉价的。...这个对于我们处于大型 Spring 项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然 20 或者 30 秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。...Spring Framework 5.0 对于流式处理的支持依赖于 Project Reactor 来构建, 其专门实现了 Reactive Streams API。...这里有一个使用 Spring 5.0 的 REST 端点的 WebClient 实现: WebClient webClient = WebClient.create(); Mono person = webClient.get

    1.1K80

    Spring Framework 5.0 新特性总结!!!

    应用程序构建任务可以定义当前项目自己的 META-INF/spring.components 文件。在编译时,源模型是自包含的,JPA 实体和 Spring 组件是已被标记的。...但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。 加载组件索引的耗费是廉价的。...这个对于我们处于大型 Spring 项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。 虽然 20 或者 30 秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。...Spring Framework 5.0 对于流式处理的支持依赖于 Project Reactor 来构建, 其专门实现了 Reactive Streams API。...这里有一个使用 Spring 5.0 的 REST 端点的 WebClient 实现: WebClient webClient = WebClient.create(); Mono person = webClient.get

    1.2K10

    Spring-webflux默认使用Netty?

    学习一下Spring-webflux框架? Spring-webflux简介 spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架。...而响应式编程,其实是为这种异步非阻塞的流式编程制定的一套标准。流式编程已不陌生了,Java8提供的stream api就是这种风格。...Spring-webflux的响应式API Spring-webflux框架是基于Reactor这个开源项目开发的。Reactor框架是跟Spring紧密配合的。...如果一个webmvc项目中有很多的外部系统调用,可以试试响应式的 **WebClient** ,它能直接从 **Controller** 的方法中返回响应式结果。...响应式编程的学习路线是比较陡峭的,所以如果你身在一个大型的团队中,要考虑投入的成本;不过可以用用 **WebClient** 来体验下响应式编程。

    38010

    别再使用 RestTemplate了,来了解一下官方推荐的 WebClient

    大家好,我是不才陈某~ 在 Spring Framework 5.0 及更高版本中,RestTemplate 已被弃用,取而代之的是较新的 WebClient。...这意味着虽然 RestTemplate 仍然可用,但鼓励 Spring 开发人员迁移到新项目的 WebClient。...更好地支持流式传输:WebClient 支持请求和响应正文的流式传输,这对于处理大文件或实时数据非常有用。...重点:即使升级了spring web 6.0.0版本,也无法在HttpRequestFactory中设置请求超时,这是放弃使用 RestTemplate 的最大因素之一。...设置请求超时不会有任何影响 总的来说,虽然 RestTemplate 可能仍然适用于某些用例,但 WebClient 提供了几个优势,使其成为现代 Spring 应用程序的更好选择。

    1.7K30

    Spring Boot 2.0 极简教程》附录 I : Spring 5.0 新特性《Spring Boot 2.0 极简教程》附录 I : Spring 5.0 新特性

    在Java 8中我们可以写一个lambda表达式作为第二个参数的值进去。...Spring Framework 5 改进了扫描和识别组件的方法,使大型项目的性能得到提升。...目前,扫描是在编译时执行的,而且向 META-INF/spring.components 文件中的索引文件添加了组件坐标。该索引是通过一个为项目定义的特定平台应用的构建任务来生成的。...这个对于我们处于大型 Spring 项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然 20 或者 30 秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。...下面是一个使用 Spring 5.0 的 REST 端点的 WebClient 实现示例: WebClient webClient = WebClient.create(); Mono person =

    2.5K30

    Spring-webflux 响应式编程

    前言 Spring 提供了两个并行堆栈。一种是基于带有 Spring MVC 和 Spring Data 结构的 Servlet API。...而响应式编程,其实是为这种异步非阻塞的流式编程制定的一套标准。流式编程已不陌生了,Java8提供的stream api就是这种风格。...如果您有一个调用远程服务的 Spring MVC 应用程序,请尝试响应式WebClient. 您可以直接从 Spring MVC 控制器方法返回反应类型(Reactor、RxJava或其他)。...Spring MVC 控制器也可以调用其他响应式组件。 如果您有一个大型团队,请记住向非阻塞、函数式和声明式编程转变的陡峭学习曲线。...在没有完全开关的情况下启动的一种实用方法是使用 reactive WebClient。除此之外,从小处着手并衡量收益。我们预计,对于广泛的应用,这种转变是不必要的。

    1.4K30

    使用C#WebClient类访问(上传下载删除列出文件目录)由IIS搭建的http文件服务器

    其实,就是使用C#WebClient类访问由IIS搭建的http文件服务器的问题花了我足足两天的时间,因此,有必要写下自己所学到的,同时,也能让广大的博友学习学习一下。...关于如何将特定组或用户设置权限的问题,请自行百度 21)查看本机IIS的IP地址,并在浏览器输入该IP,将会显示以下内容,如下图所示: ? ? 22)自此,IIS文件服务器的搭建已经完毕。...使用C#WebClient访问IIS文件服务器 本博文使用的的IDE为VS2015,在使用WebClient类之前,必须先引用System.Net命名空间,文件下载、上传与删除的都是使用异步编程,也可以使用同步编程...2)文件上传: static void Main(string[] args) { //定义_webClient对象 WebClient...; //异步从文件(模拟)删除文件 _webClient.UploadDataAsync(_uri, "DELETE", new byte[0]);

    2.5K00

    针对黑客的Windows文件传输总结

    我们将介绍如何将文件从攻击者计算机传输到受害者 Windows 10 主机(下载),以及如何从受害者 Windows 10 主机传输回攻击者计算机(上传)的各种技术。...无论哪种方式,我们都需要知道如何将这些工具或漏洞发送给受害者,更重要的是,我们需要知道实现这一目标的多种方法。...然而,由于它不是内置的,我们需要建立一种传输文件的方法,以便将其传输到我们的受害者计算机上。虽然绝对值得一提,但在我看来,它有点多余,因为它不能成为首选。...使用 netcat,我们可以将文件从攻击者机器传输到受害者,也可以从受害者传输到攻击者机器。...现在我们已经了解了如何将可执行文件从攻击者计算机直接加载到受害者的内存中,让我们看看如何加载 PS1 脚本,因为我们还使用了 -s开关。

    62411

    2018年终总结

    images (1).png 盘点 整体而言,今年技术层面稍微有点拓宽,跨入了外表看上去高大上的流式计算领域,打开了另外一扇窗;而基于java的分布式/微服务领域,今年变化比较大,spring cloud...今年定的几个目标基本也没有实现,明年就不再定具体的目标了,大的几个方向就是深入研究流式计算及系统架构,同时也希望自己脚踏实地的同时多仰望星空,多感受人文的世界。...聊聊RibbonLoadBalancerClient的choose方法 聊聊WebClient的LoadBalance支持 redis 聊聊spring-boot-starter-data-redis...5 webclient使用指南 spring webflux文件上传下载 spring webflux返回application/stream+json reactor3 flux的map与flatMap...的区别 聊聊reactor extra的retry 使用webflux提升数据导出效率 spring 5 webflux异常处理 webclient的超时时间配置 FluxInterval实例及解析 FluxSink

    1.2K20

    一款适用于.Net的高性能文件上传流

    今天给大家推荐一款开源的适用于.Net的高性能文件上项目UploadStream。 背景 流式多部分文件上传是指将文件分成多个部分,然后逐个部分上传到服务器。...这种方式可以减少内存使用,提高上传性能,尤其是在上传大型文件时。 由于微软官方推荐的流式多部分文件上传代码比较复杂,作者对微软官方推荐的流式多部分文件上传代码进行了简化和重写,使其更容易理解和使用。...3.1 项目性能结果的报告地址: https://medium.com/@ma1f/file-streaming-performance-in-dotnet-4dee608dd953 特点 优化多部分流式文件上传性能...这对大型文件来说并不理想,因为流的处理应该在流式传输过程中发生,而不是将整个文件(s) 缓冲到内存/磁盘中。...简而言之,该软件包可以显著提高大型文件上传的性能和内存效率。

    24210
    领券