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

}

以上是 使用Feign实现微服务间文件下载 的全部内容, 来源链接: utcz.com/z/348015.html

回到顶部