使用Feign實(shí)現(xiàn)微服務(wù)間文件下載
在使用Feign做服務(wù)間調(diào)用的時(shí)候,當(dāng)下載大的文件會(huì)出現(xiàn)堆棧溢出的情況。另外,文件管理服務(wù)(服務(wù)提供者)文件下載接口無(wú)返回值,是通過(guò)HttpServletRespoonse傳輸?shù)牧鲾?shù)據(jù)來(lái)響應(yīng),那么服務(wù)消費(fèi)者該如何接受下載的數(shù)據(jù)呢?
一. 示例介紹
我們調(diào)用feign_upload_second的下載文件接口下載文件,feign_upload_second內(nèi)部使用feign調(diào)用feign_upload_first實(shí)現(xiàn)文件下載。
二、feign_upload_first服務(wù)提供者
服務(wù)提供者下載文件接口
@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服務(wù)消費(fèi)者
服務(wù)提供者遠(yuǎn)程調(diào)用接口
@RequestMapping(value = "/downloadFile",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) Response downloadFile();
用feign.Response來(lái)接收
服務(wù)提供者下載文件接口
@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; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis-plus分頁(yè)查詢(xún)不生效問(wèn)題排查全過(guò)程
最近寫(xiě)分頁(yè)的時(shí)候,遇到了分頁(yè)無(wú)法正常發(fā)揮作用的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus分頁(yè)查詢(xún)不生效問(wèn)題排查的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03SpringBoot項(xiàng)目整合mybatis的方法步驟與實(shí)例
今天小編就為大家分享一篇關(guān)于SpringBoot項(xiàng)目整合mybatis的方法步驟與實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03SpringBoot 監(jiān)控管理模塊actuator沒(méi)有權(quán)限的問(wèn)題解決方法
這篇文章主要介紹了SpringBoot 監(jiān)控管理模塊actuator沒(méi)有權(quán)限的問(wèn)題解決方法,需要的朋友可以參考下2017-12-12JDBC數(shù)據(jù)庫(kù)連接過(guò)程及驅(qū)動(dòng)加載與設(shè)計(jì)模式詳解
這篇文章主要介紹了JDBC數(shù)據(jù)庫(kù)連接過(guò)程及驅(qū)動(dòng)加載與設(shè)計(jì)模式詳解,需要的朋友可以參考下2016-10-10Java使用IOC控制反轉(zhuǎn)的三種設(shè)計(jì)模式詳解
這篇文章主要為大家詳細(xì)介紹了Java使用IOC控制反轉(zhuǎn)的三種設(shè)計(jì)模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10java中動(dòng)態(tài)代理如何實(shí)現(xiàn)詳解
動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的代理,mybatis就是用這個(gè)技術(shù)實(shí)現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于java中動(dòng)態(tài)代理如何實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-01-01java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶(hù)訪(fǎng)問(wèn)
本篇文章主要介紹了java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶(hù)訪(fǎng)問(wèn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02