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

 更新时间:2019年04月26日 09:51:37   作者:AaronSimon  
这篇文章主要为大家详细介绍了使用Feign实现微服务间文件下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在使用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;
}

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

相关文章

  • 详解spring cloud构建微服务架构的网关(API GateWay)

    详解spring cloud构建微服务架构的网关(API GateWay)

    这篇文章主要介绍了详解spring cloud构建微服务架构的网关(API GateWay),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • swagger2和knife4j的详细使用教程(入门级)

    swagger2和knife4j的详细使用教程(入门级)

    最近项目中用到了Swagger2和knife4j作为接口文档,所以下面这篇文章主要给大家介绍了关于swagger2和knife4j的详细使用教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java字符串转时间简单示例代码

    Java字符串转时间简单示例代码

    这篇文章主要给大家介绍了关于Java字符串转时间的相关资料,在Java中字符和字符串常常需要相互转化,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • feign参数过多导致调用失败的解决方案

    feign参数过多导致调用失败的解决方案

    这篇文章主要介绍了feign参数过多导致调用失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解决springboot+activemq启动报注解错误的问题

    解决springboot+activemq启动报注解错误的问题

    这篇文章主要介绍了解决springboot+activemq启动报注解错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 举例讲解设计模式中的访问者模式在Java编程中的运用

    举例讲解设计模式中的访问者模式在Java编程中的运用

    这篇文章主要介绍了举例讲解设计模式中的访问者模式在Java编程中的运用,访问者模式是一种将算法与对象结构分离的软件设计模式,需要的朋友可以参考下
    2016-05-05
  • @RequestAttribute和@RequestParam注解的区别及说明

    @RequestAttribute和@RequestParam注解的区别及说明

    这篇文章主要介绍了@RequestAttribute和@RequestParam注解的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Mybatis查询时数据丢失的问题及解决

    Mybatis查询时数据丢失的问题及解决

    Mybatis查询时数据丢失的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java Fluent Mybatis实战之构建项目与代码生成篇下

    Java Fluent Mybatis实战之构建项目与代码生成篇下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis
    2021-10-10
  • JavaSE实现三子棋游戏

    JavaSE实现三子棋游戏

    这篇文章主要为大家详细介绍了JavaSE实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论