本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下:

WebClient是从Spring 5开始提供的一个HTTP客户端库,为了使用WebClient进行文件上传和下载,需要我们先编写服务端的支持文件上传和下载的程序。请参考我之前写的一篇文章:SpringBoot实现本地存储文件上传及提供HTTP访问服务。按照此文完成学习之后,可以获得

  • 一个以访问服务URI为"/upload”的文件上传服务端点
  • 服务端点上传文件成功后会返回一个HTTP连接,可以用来下载文件。

下面我们就开始学习使用WebClient是HTTP客户端库,进行文件的上传与下载。

一、文件上传

在本地8888端口搭建了一个文件上传接收的服务端,服务端点为“/upload”。上传本地磁盘中的一个文件"D:\data\local\splash.png"

@SpringBootTest
class UpDownLoadTests { //创建webClient
private WebClient webClient = WebClient.builder()
.baseUrl("http://localhost:8888/")
.build(); @Test
void testUpload() {
// 待上传的文件(存在客户端本地磁盘)
String filePath = "D:\\data\\local\\splash.png";
// 封装请求参数
FileSystemResource resource = new FileSystemResource(new File(filePath));
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("uploadFile", resource); //服务端MultipartFile uploadFile
//param.add("param1", "test"); //服务端如果接受额外参数,可以传递 // 发送请求
Mono<String> mono = webClient
.post() // POST 请求
.uri("/upload") // 请求路径
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.body(BodyInserters.fromMultipartData(param))
.retrieve() // 获取响应体
.bodyToMono(String.class); //响应数据类型转换 // 输出结果
System.out.println(mono.block());
}
}

输出打印结果如下:

文章上传之后返回一个HTTP URL访问地址,可以通过浏览器访问,也可以通过程序下载。

二、文件下载

执行下列代码之后,被下载文件url,会被正确的保存到本地磁盘目录

@Test
void testDownLoad() throws IOException {
Mono<ClientResponse> mono = webClient
.get() // GET 请求
.uri("/2020/08/22/0f0a353a-7033-4a13-832e-d043f6360514.png") // 请求路径
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchange(); // 获取响应体 ClientResponse response = mono.block();
Resource resource = response.bodyToMono(Resource.class).block(); assert resource != null;
Files.copy(resource.getInputStream(),
Paths.get("D:\\data\\local\\splash-down.png" )); }

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

精讲响应式WebClient第4篇-文件上传与下载的更多相关文章

  1. 精讲响应式WebClient第5篇-请求超时设置与异常处理

    本文是精讲响应式WebClient第5篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  2. 精讲响应式WebClient第6篇-请求失败自动重试机制,强烈建议你看一看

    本文是精讲响应式WebClient第6篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  3. 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解

    本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本 ...

  4. 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用

    本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

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

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

  6. 精讲RestTemplate第6篇-文件上传下载与大文件流式下载

    本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  7. Struts2第六篇【文件上传和下载】

    前言 在讲解开山篇的时候就已经说了,Struts2框架封装了文件上传的功能--..本博文主要讲解怎么使用Struts框架来完成文件上传和下载 回顾以前的文件上传 首先,我们先来回顾一下以前,我们在we ...

  8. java基础篇---文件上传(smartupload组件)

    文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用 ...

  9. java基础篇---文件上传(组件)

    转载自:http://www.cnblogs.com/oumyye/p/4234969.html 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本 ...

随机推荐

  1. ls -bash: ls: command not found

    ls -bash: ls: command not found原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.解决方案: export PATH=/us ...

  2. kafka笔记——kafka启动

    1. 准备 阿里云Linux服务器一个(Centos7) 腾讯云Linux服务器一个(CentOs7) zookeeper,kafka压缩包 Java环境配置好 要死....脚本之家 2. 安装 zo ...

  3. 编写优美Android注释的常用语法

    编写优美Android注释的常用语法   短期目标是定期能出一篇简文,希望自己能坚持下去~~~~( ̄_, ̄ )   附上Android君 今天要分享的是关于Android注释系统的一些强大功能!! 实 ...

  4. SpringCloud系列使用Eureka进行服务治理

    1. 什么是微服务? "微服务"一词来自国外的一篇博文,网站:https://martinfowler.com/articles/microservices.html 如果您不能看 ...

  5. API返回延迟,FPM重启后恢复之后又重现 问题解决方案

    背景 最近在提供后台API时,提供了一个简单逻辑的接口 部署在测试环境,自测没问题,提交测试 突然有一天,接口响应延迟严重,几乎每次都是3-4秒返回 这对于一个接口来说,肯定是有问题的 于是便有了以下 ...

  6. Python 为什么会有个奇怪的“...”对象?

    本文出自"Python为什么"系列,请查看全部文章 在写上一篇<Python 为什么要有 pass 语句?>时,我想到一种特别的写法,很多人会把它当成 pass 语句的 ...

  7. 【FZYZOJ】下片 题解(最短路+超级源点)

    题目描述 为了提高服务器的耐受能力,很多流量大的网站都会架设多台服务器,而互联网的路由能找到线路最短的一台服务器. 现在UOI想要下片,他有好多台电脑,又有好多服务器可以提供下载.UOI将给你一个网络 ...

  8. 软件tf版本是什么意思?

    对于iOS用户来说,有时候会听到tf版本软件,软件tf版本究竟是什么意思呢?它与正常在App Store中下载的软件有什么不同呢? 对于大多数iOS用户来说,一般都是从App Store中下载应用,凡 ...

  9. 【转】一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    [转]原文链接:https://cloud.tencent.com/developer/article/1497826 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定 ...

  10. SpringBoot2.x下RabbitMQ的并发参数(concurrency和prefetch)

      RabbitMQ消费端配置 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listene ...