本文是精讲响应式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. Kubernetes中强制删除Pod、namespace

    Kubernetes中强制删除Pod.namespace 解决方法 可使用kubectl中的强制删除命令 # 删除POD kubectl delete pod PODNAME --force --gr ...

  2. Django学习路32_创建管理员及内容补充+前面内容复习

    创建管理员 python manage.py createsuperuser   数据库属性命名限制 1.不能是python的保留关键字 2.不允许使用连续的下划线,这是由django的查询方式决定的 ...

  3. PHP quoted_printable_encode() 函数

    定义和用法 quoted_printable_encode() 函数把 8 位字符串转换为 quoted-printable 字符串. 提示:经过 quoted-printable 编码后的数据与通过 ...

  4. CF724C Ray Tracing 扩展欧几里得 平面展开

    LINK:Ray Tracing 虚这道题很久了 模拟赛考了一个加强版的 瞬间就想到了这道简化版的. 考虑做法 暴力模拟可能可以 官方正解好像就是这个. 不过遇到这种平面问题可以考虑把平面给无限的展开 ...

  5. ACwing 147 数据备份 贪心 set

    LINK:数据备份 以前做过这种贪心 不过没有好好的证明 这次来严格的证明一下. 不难发现 最后的答案 选择的所有两对公司必然相邻. 所以排序后 把数组变成ai-ai-1. 这样问他的模型就是 n-1 ...

  6. 加密模块hashlib模块(* *)

    用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 越往后加密算法越复杂,这些算法都是不可逆的,MD5 算法 ...

  7. object detection 总结

    1.基础 自己对于YOLOV1,2,3都比较熟悉. RCNN也比较熟悉.这个是自己目前掌握的基础2.第一步 看一下2019年的井喷的anchor free的网络3.第二步 看一下以往,引用多的网路4. ...

  8. wifi渗透

    前言 本文主要讲述 家庭家庭家庭中(重要的事情说三遍,企业认证服务器的wifi一般非常非常的安全破解不来)如何破解wifi密码,破解wifi密码后的内网渗透利用(简单说明),如何设置wifi路由器更安 ...

  9. java进阶(6)--访问控制权限

    一.四种访问控制权限   二.举例同包下访问权限

  10. C# ASP 动态添加Html Table行

    用JS放法实现以下效果: 前端文件Questionnaire23.aspx: <%@ Page Title="题目" Language="C#" Mast ...