使用Feign实现微服务间文件下载

所属分类: 软件编程 / java 阅读数: 26
收藏 0 赞 0 分享

在使用Feign做服务间调用的时候,当下载大的文件会出现堆栈溢出的情况。另外,文件管理服务(服务提供者)文件下载接口无返回值,是通过HttpServletRespoonse传输的流数据来响应,那么服务消费者该如何接受下载的数据呢?

一. 示例介绍

我们调用feign_upload_second的下载文件接口下载文件,feign_upload_second内部使用feign调用feign_upload_first实现文件下载。

二、feign_upload_first服务提供者

服务提供者下载文件接口

@RequestMapping(value = "/downloadFile",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
 public void downloadFile(HttpServletResponse response){
  String filePath = "D://1.txt";
  File file = new File(filePath);
  InputStream in = null;
  if(file.exists()){
  try {
   OutputStream out = response.getOutputStream();
   in = new FileInputStream(file);
   byte buffer[] = new byte[1024];
   int length = 0;
   while ((length = in.read(buffer)) >= 0){
   out.write(buffer,0,length);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if(in != null){
   try {
    in.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   }
  }
  }
 }

三、feign_upload_second服务消费者

服务提供者远程调用接口

@RequestMapping(value = "/downloadFile",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
 Response downloadFile();

用feign.Response来接收

服务提供者下载文件接口

@RequestMapping(value = "/download",method = RequestMethod.GET)
 public ResponseEntity<byte[]> downFile(){
 ResponseEntity<byte[]> result=null ;
 InputStream inputStream = null;
 try {
  // feign文件下载
  Response response = uploadService.downloadFile();
  Response.Body body = response.body();
  inputStream = body.asInputStream();
  byte[] b = new byte[inputStream.available()];
  inputStream.read(b);
  HttpHeaders heads = new HttpHeaders();
  heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=123.txt");
  heads.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE);

  result = new ResponseEntity <byte[]>(b,heads, HttpStatus.OK);
 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  if(inputStream != null){
  try {
   inputStream.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 return result;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

SpringBoot环境搭建及第一个程序运行(小白教程)

这篇文章主要介绍了SpringBoot环境搭建及第一个程序运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

这篇文章主要介绍了过滤器 和 拦截器的 6个区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

SpringBoot整合SpringTask实现定时任务的流程

这篇文章主要介绍了SpringBoot整合SpringTask实现定时任务的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode快速引入第三方jar包发QQ邮件

这篇文章主要介绍了vscode快速引入第三方jar包发QQ邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java Enum和String及int的相互转化示例

这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring boot如何快速的配置多个Redis数据源

这篇文章主要介绍了Spring boot如何快速的配置多个Redis数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 对接腾讯云直播的实现

这篇文章主要介绍了JAVA 对接腾讯云直播的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JavaSE static final及abstract修饰符实例解析

这篇文章主要介绍了JavaSE static final及abstract修饰符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

SpringBoot定时任务参数运行代码实例解析

这篇文章主要介绍了SpringBoot定时任务运行代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot调用 Shell 脚本实现看门狗功能

这篇文章主要介绍了Spring Boot调用 Shell 脚本实现看门狗功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多