RestTemplate文件上传下载与大文件流式下载

目录
  • 一、文件上传
  • 二、文件下载
  • 三、大文件下载

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

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<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文件上传下载与大文件流式下载的详细内容,更多关于RestTemplate大文件流式上传下载的资料请关注我们其它相关文章!

(0)

相关推荐

  • RestTemplate GET请求使用方法详解

    目录 一.getForObject()方法 1.1.以String的方式接受请求结果数据 1.2.以POJO对象的方式接受结果数据 1.3.以数组的方式接收请求结果 1.4.使用占位符号传参的几种方式 二.getForEntity()方法 欢迎关注我的博客,里面有很多精品合集本文转载注明出处(必须带连接,不能只转文字):字母哥博客. 本文是精讲RestTemplate第3篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用精讲Rest

  • RestTemplate发送HTTP POST请求使用方法详解

    目录 一.postForObject发送JSON格式请求 二.postForObject模拟表单数据提交 三.url支持占位符语法 四.postForEntity()方法 五.postForLocation()方法的使用 本文是精讲RestTemplate第4篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲 RestTemplate实现多种底层HTTP客户端类库的切换用法 RestTemplate发送HTTP GET请求使用方法详解 在上一节

  • 关于SpringBoot大文件RestTemplate下载解决方案

    近期基于项目上使用到的RestTemplate下载文件流,遇到1G以上的大文件,下载需要3-4分钟,因为调用API接口没有做分片与多线程, 文件流全部采用同步方式加载,性能很慢.最近结合网上案例及自己总结,写了一个分片下载tuling/fileServer项目: 1.包含同步下载文件流在浏览器加载输出相关代码: 2.包含分片多线程下载分片文件及合并文件相关代码: 另外在DownloadThread项目中使用代码完成了一个远程RestUrl请求去获取一个远端资源大文件进行多线程分片下载 到本地的一

  • RestTemplate发送get和post请求,下载文件的实例

    下图是我的所有测试接口,包含两个表单提交接口和一个Rest接口: 我是用的Http请求工具是Spring自带的RestTemplate. 请求的方法如下: 三个请求分别对应三个接口,在此记录下. 下载文件,获取文件字节流: RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); ResponseEntity<byte[]> entity = restTemplate.exc

  • SpringMVC 文件上传配置,多文件上传,使用的MultipartFile的实例

    基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤 文件上传项目的源码下载地址:demo 一.配置文件: SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver -->

  • php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)

    网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特色),学php的人都知道文件上传怎么做,但很多人在编程中却可能忽视了一些细节问题,那就是文件的类型(MIME).在表单将文件提交给php做处理之前,浏览器会先解析识别一边是什么类型的文件,之后进入php处理环节,php又会去识别解析此文件的原始类型(并不是说你改成什么后缀就是什么文件).在这个过程中会有一些浏览器兼容,更准确来说是文件类型解析标识不一致的问

  • Servlet实现文件上传,可多文件上传示例

    一.Servlet实现文件上传,需要添加第三方提供的jar包 下载地址: 1) commons-fileupload-1.2.2-bin.zip:  点击打开链接 2)  commons-io-2.3-bin.zip:    点击打开链接 接着把这两个jar包放到 lib文件夹下: 二:文件上传的表单提交方式必须是POST方式, 编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded 比如: &l

  • Spring boot实现文件上传实例(多文件上传)

    文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个表单页面(这里使用thymleaf); (4)编写controller; (5)测试: (6)对上传的文件做一些限制: (7)多文件上传实现 (1)新建maven Java project 新建一个名称为spring-boot-fileupload maven Java项目: (2)在pom.xml加入相应依赖: 加入相应的maven依赖,具体看以下解释: <pro

  • element el-upload文件上传覆盖第一个文件的实现

    目录 基本用法 显示已上传文件列表 解决办法 总结 upload上传是前端开发很常用的一个功能,在Vue开发中常用的Element组件库也提供了非常好用的upload组件 基本用法 先来看官网 <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" accept=".xls, .xlsx" :on-preview="ha

  • php 文件上传代码(限制jpg文件)

    复制代码 代码如下: <?php /* 图片上传类  仅限JPG格式图片 */ class uploadFile { var $inputName; //input名称 var $fileName; //文件命名 var $fileProperty; //文件属性 var $fileSize=2097152; //文件大小限制,2M var $filePath="upload/"; //文件存储路径 function uploadFile($inputName){ $this-&

  • PHP文件上传后缀名与文件类型对照表整理

    ie 火狐 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd application/octet-stream 5 ico image/x-icon 6 rar application/octet-stream 7 zip application/zip 8 7z application/octet-stream 9 exe application/octet-str

  • JavaWeb简单文件上传流程的实战记录

    目录 引言 前端上传文件 后端接受文件 总结 引言 这里实现一个简单的图片上传功能,主要是熟悉这个文件上传的交互流程.关于更复杂的文件上传,如大文件的切片上传.断点续传等,这里不做过多介绍. 前端上传文件 首先在前端创建一个页面,这里我们选择通过form表单的形式上传文件.在选择时,使用input标签中 的file类型就可以自动的选择本地文件. <!DOCTYPE html> <html lang="en"> <head> <meta char

  • JavaWeb实现文件上传下载功能实例解析

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • JavaWeb实现文件上传下载功能实例详解

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 文件上传概述 1.文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2.文件上传对页面的要求 上传文件的要求比较多,需要记一下: 必须使用表单,而不能是超链接 表单的method必须是POST,而不能是GET 表单的enctype必须是multipart/form-data 在表单中添加file表单字段,即<input ty

随机推荐