C++Templates(第2版英文版)

123.24元

(需用券)

去购买 >

本文是精讲RestTemplate第6篇,前篇的blog访问地址如下:

精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用

精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换

精讲RestTemplate第3篇-GET请求使用方法详解

精讲RestTemplate第4篇-POST请求方法使用详解

精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解

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

一个以访问服务URI为"/upload”的文件上传服务端点

服务端点上传文件成功后会返回一个HTTP连接,可以用来下载文件。

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

一、文件上传

写一个单元测试类,来完成RestTemplate文件上传功能,具体实现细节参考代码注释

@SpringBootTest

class UpDownLoadTests {

@Resource

private RestTemplate restTemplate;

@Test

void testUpload() {

// 文件上传服务上传接口

String url = "http://localhost:8888/upload";

// 待上传的文件(存在客户端本地磁盘)

String filePath = "D:\\data\\local\\splash.png";

// 封装请求参数

FileSystemResource resource = new FileSystemResource(new File(filePath));

MultiValueMap param = new LinkedMultiValueMap<>();

param.add("uploadFile", resource); //服务端MultipartFile uploadFile

//param.add("param1", "test"); //服务端如果接受额外参数,可以传递

// 发送请求并输出结果

System.out.println("--- 开始上传文件 ---");

String result = restTemplate.postForObject(url, param, String.class);

System.out.println("--- 访问地址:" + result);

}

}

输出结果如下:

--- 开始上传文件 ---

--- 访问地址:http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png

文件上传之后,可以通过上面的访问地址,在浏览器访问。或者通过RestTemplate客户端进行下载。

二、文件下载

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

@Test

void testDownLoad() throws IOException {

// 待下载的文件地址

String url = "http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png";

ResponseEntity rsp = restTemplate.getForEntity(url, byte[].class);

System.out.println("文件下载请求结果状态码:" + rsp.getStatusCode());

// 将下载下来的文件内容保存到本地

String targetPath = "D:\\data\\local\\splash-down.png";

Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(),

"未获取到下载文件"));

}

这种下载方法实际上是将下载文件一次性加载到客户端本地内存,然后从内存将文件写入磁盘。这种方式对于小文件的下载还比较适合,如果文件比较大或者文件下载并发量比较大,容易造成内存的大量占用,从而降低应用的运行效率。

三、大文件下载

这种下载方式的区别在于

设置了请求头APPLICATION_OCTET_STREAM,表示以流的形式进行数据加载

RequestCallback 结合File.copy保证了接收到一部分文件内容,就向磁盘写入一部分内容。而不是全部加载到内存,最后再写入磁盘文件。

@Test

void testDownLoadBigFile() throws IOException {

// 待下载的文件地址

String url = "http://localhost:8888/2020/08/12/028b38f1-3f9b-4088-9bea-1af8c18cd619.png";

// 文件保存的本地路径

String targetPath = "D:\\data\\local\\splash-down-big.png";

//定义请求头的接收类型

RequestCallback requestCallback = request -> request.getHeaders()

.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));

//对响应进行流式处理而不是将其全部加载到内存中

restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> {

Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath));

return null;

});

}

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

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

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

《手摸手教你学Spring Boot2.0》

《Spring Security-JWT-OAuth2一本通》

《实战前后端分离RBAC权限管理系统》

《实战SpringCloud微服务从青铜到王者》

《VUE深入浅出系列》

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

java流式上传下载_精讲RestTemplate第6篇-文件上传下载与大文件流式下载相关推荐

  1. spring boot api文档_精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用

    一.什么是 RestTemplate? RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpCo ...

  2. 精讲RestTemplate第3篇-GET请求使用方法详解

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

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

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

  4. java上传文件并保存到服务器----大文件上传

    一般的文件上传(不依赖spring) /*** 保存文件** @param path 文件绝对路径* @param fileBytes 文件字节数据* @throws ApiServiceExcept ...

  5. quarts集群 运维_精讲Elastic-job + Quartz实现企业级定时任务

    掌握分布式集群方式的定时任务框架,可以弥补企业中常用的单点任务的缺点,以更高的性能更好的稳定性处理分布式定时任务服务:本课程带你掌握分布式框架Elastic-Job和Quartz,在以多种方式开发定时 ...

  6. 从阻塞式IO到epoll——IO精讲

    Linux虚拟文件系统的理解 VFS 是一棵树, 树上的节点可以映射到对应的物理位置 与之对应的,什么是实际上的文件系统呢,比如说Windows操作系统上的,D盘对应的就是那块磁盘,C盘对应的就是这块 ...

  7. java common io_Java之Apache Commons-IO使用精讲

    Commons IO是针对开发IO流功能的工具类库. 主要包括六个区域: 工具类--使用静态方法执行共同任务 输入--用于InputStream和Reader实现 输出--用于OutputStream ...

  8. rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络

    每天给小编五分钟,小编用自己的代码,让你轻松学习人工智能.本文将剖析循环神经网络(RNN)的工作原理,精讲循环神经网络的特点和实现方式.野蛮智能,小白也能看懂的人工智能. 循环神经网络从何而来? 我在 ...

  9. java爬取网页并保存_第九讲:Python爬取网页图片并保存到本地

    上一讲我们说了如何把网页的数据通过分析后存储到数据库,我们这次讲如何将网页上的图片提取并下载到本地. 思路如下: 我们本次要爬取的是昵图网首页的图片. 1.首先分析我们要爬取的网页的代码结构,每个网页 ...

最新文章

  1. 使用MySQL组复制的限制和局限性
  2. numpy 矩阵的用法
  3. python数组和矩阵用法
  4. Centos 搭建activemq
  5. Android studio 设置主题
  6. python3中urlopen_解决python3 urllib中urlopen报错的问题
  7. 在Sharepoint Designer 2007 中加入定制的工作流动作
  8. Windows中NTP服务器的搭建和时间同步
  9. iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
  10. android selector的item属性
  11. ios html 图片旋转了,解决移动端iOS下上传图片被旋转问题。
  12. 一个人做饭有哪些推荐?
  13. 新手指南|欢迎来到CSDN
  14. 平流方程基于MATLAB数值解法,Matlab微分方程高效解法:谱方法原理与实现
  15. onenote打开闪退平板_Win10系统下OneNote打不开或闪退如何解决
  16. 【转载】2012年七个免费ASP空间分享-支持ASP、ASP.NET的空间
  17. win10安装oracle数据库失败
  18. VB中的二维数组输出的定位
  19. java 获取est时间_将日期字符串(EST)转换为Java日期(UTC)
  20. cpu 指锟筋集 linux锟介看 shell,Linux Shell中PS命令中的%CPU的含义介绍

热门文章

  1. Python接口获取12306火车票信息
  2. 火车票管理系统linux,火车票管理系统
  3. 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件”
  4. 车机如何安装鸿蒙os,鸿蒙小车安装详细教程
  5. three.js 事件交互
  6. C++ 工程实践(5):避免使用虚函数作为库的接口
  7. 阳性感染者被要求带病上班?广东省人社厅:阳性感染者应居家隔离
  8. python将十位数变成0_Python:战略性地通过0-9的十位数字
  9. Hive 启动报错java.net.URISyntaxException: Relative path in absolute URI 解决方法
  10. How scalable is OpenVZ?