精讲RestTemplate第6篇-文件上传下载与大文件流式下载
本文是精讲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 {@Resourceprivate RestTemplate restTemplate;@Testvoid testUpload() {// 文件上传服务上传接口String url = "http://localhost:8888/upload";// 待上传的文件(存在客户端本地磁盘)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"); //服务端如果接受额外参数,可以传递// 发送请求并输出结果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<byte[]> 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;});
}
精讲RestTemplate第6篇-文件上传下载与大文件流式下载相关推荐
- java http 上传大文件上传_java实现大文件的上传
最近项目经理逼着让偶做树的展开,表嵌套表,可惜偶刚参加工作,水平低,这不在查资料嘛,可是不多久就传来了经理的叫嚣声,这么简单的东西,都一天了,你还没做完..................,哎真是郁闷 ...
- php大文件上传插件,PHP 大文件上传进度条实现
目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩 ...
- java流式上传下载_精讲RestTemplate第6篇-文件上传下载与大文件流式下载
C++Templates(第2版英文版) 123.24元 (需用券) 去购买 > 本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在S ...
- 精讲RestTemplate第3篇-GET请求使用方法详解
本文是精讲RestTemplate第3篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- jquery文件上传插件 uploadify java_jQuery文件上传插件Uploadify使用指南
对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持 Flash,主要特性:支持多文件上传.HTML5版本可拖拽上传.实时上传进度条显示.强大的参数 定制功能,如文件大小. ...
- hadoop HDFS的文件夹创建、文件上传、文件下载、文件夹删除,文件更名、文件详细信息、文件类型判断(文件夹或者文件)
摘要: 本篇文章主要介绍的是hadoop hdfs的基础api的使用.包括Windows端依赖配置,Maven依赖配置.最后就是进行实际的操作,包括:获取远程hadoop hdfs连接,并对其进行的一 ...
- 00截断上传绕过_【文件上传与解析】文件上传与解析漏洞总结v1.0
点击上方"公众号" 可以订阅哦! Hello,各位小伙伴晚上好~ 这里是依旧勤劳写公众号的小编~ 今天本公众号将推出一个新的模块,那就是漏洞知识点总结模块!!!(此处应有掌声~) ...
- asp.net实现ftp上传代码(解决大文件上传问题)
asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...
- php 拖动多个文件上传,dropzone拖拽文件上传一次上传多个文件的方法
用dropzone插件拖拽文件上传默认情况是把一个文件拖到浏览器后就立即自动上传,参考前文<用dropzone插件拖拽文件上传>,如果需要一次上传多个文件怎么办?本文将介绍其实现方法. d ...
- SSM框架使用Layui文件上传插件实现多文件上传(多文件列表)
SSM框架使用Layui文件上传插件实现多文件上传(多文件列表) pom.xml文件的配置 想要实现SSM框架实现多文件上传,必要的jar包必须要在pom.xml文件中引入.如下: <!--co ...
最新文章
- C/C++在不确定输入字符串长度情况下,对其进行存储和字符操作问题
- 国产光刻设备第一股:从官司缠身到国产希望?
- QT的QLineSeries类的使用
- Linux系统里让vim支持markdown格式的语法高亮
- 睿停车系统车场服务器,睿停车后台管理中心系统-用户手册-前台版本
- 【Win 10 应用开发】手写识别
- 威联通服务器操作系统,QNAP 威联通 453BT3 网络存储服务器 使用手记,Nas中的小钢炮...
- matlab获取全局变量的值_全局变量在几个函数及Matlab函数中都能使用的变量.PPT...
- dspic c语言教程,轻松学PIC之数码管篇 PIC单片机学习系列教程
- Xposed框架详解
- 细梳腾讯帝国幼年艰辛,竟几度面临夭折
- oppoK9Pro游戏性能怎么样
- hostapd建立无线AP出现did not acknowledge association的解决办法
- 一分钟读懂广告投放各计费CPM、CPC等(公式推导干货)
- 对接微信二维码支付流程
- PETS渗透测试标准
- 在python中建立线性回归
- [other]恢复word文档
- 饿了么跑腿APP开发主要可以实现一下功能
- 新品速递|海泰边缘安全网关护航工控数据采集