欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-10 18:49:46
在使用feign做服务间调用的时候,当下载大的文件会出现堆栈溢出的情况。另外,文件管理服务(服务提供者)文件下载接口无返回值,是通过httpservletrespoonse...

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

一. 示例介绍

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

我们调用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;
}

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