一次项目中调用API的时候没有留意,没有发现API返回的是Response流,作为中间API接口封装的服务,直接将外部返回回来的流传递给了消费者服务,导致出了问题.
后来在网上找到了原因:feign Response只能读一次问题 和 feign response 返回值拦截_社区之星的专栏-CSDN博客_feign response
所以我在我的代码里进行了一层封装Demo如下:
public void getMedia(String corpId,
String media_id,
HttpServletResponse response){
Response re = null;
InputStream is = null;
BufferedOutputStream bufferedOutputStream = null;
try{
// 这里就是通过fegin得到的response流
re = qyWechatApiMaterialService.getMedia(corpId, media_id);
is = re.body().asInputStream();
response.setHeader(HttpHeaders.CONTENT_LENGTH, ((LinkedList<String>) re.headers().get("content-length")).get(0));
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"" + getName(((LinkedList<String>) re.headers().get("content-disposition")).get(0)) + "\"");
response.setHeader(HttpHeaders.CONTENT_TYPE, ((LinkedList<String>)re.headers().get("content-type")).get(0));
// 转换成缓冲流
bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
int length = 0;
byte[] temp = new byte[1024 * 10];
while ((length = is.read(temp)) != -1) {
bufferedOutputStream.write(temp, 0, length);
}
bufferedOutputStream.flush();
}catch (IOException io){
log.error(io.getMessage());
}finally {
try {
if(bufferedOutputStream != null){
bufferedOutputStream.close();
}
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
最后问题被完美解决
版权声明:本文为qq_40708942原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。