项目场景:

微服务通过openfeign获取文件流

问题描述:

微服务通过openfeign获取文件流,消费端获取的inputSteam=null,无法获取到文件流信息


解决方案:

file服务(提供者):根据附件id,获取附件路径下载

    @ApiOperation(value = "附件下载")@RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)public void down(HttpServletResponse response,@CustomJSONBody Object object) {Map<String, String> map = (Map) object;String fileId = map.get("fileId");String[] fileInfos = attachmentService.findById(fileId);InputStream in = null;try {String filePath = fileUploadDir + fileInfos[1];if (File.separator.equals("/")) {filePath = filePath.replaceAll("\\\\", File.separator);} else if (File.separator.equals("\\\\")) {filePath = filePath.replaceAll("/", File.separator);}in = new FileInputStream(filePath);OutputStream out = response.getOutputStream();byte buffer[] = new byte[1024];int length = 0;while ((length = in.read(buffer)) >= 0){out.write(buffer,0,length);}} catch (Exception e) {logger.error("附件下载异常", e);} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}}}

feign:

    @RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)public Response down(@CustomJSONBody Object object);

业务服务(消费者):将附件打包zip文件下载(附全部zip打包相关代码,可直接看最后一个执行压缩的方法)

public void zipExcelExport(DisasterHistoryExportDTO dto, HttpServletResponse response) {List<String> ids = dto.getList().stream().map(DisasterExpandPO::getFileId).collect(Collectors.toList());List<AttachmentPO> attachmentPOList = attachmentDao.findAllById(ids);if (CollectionUtils.isNotEmpty(attachmentPOList)) {try {response.reset();// 设置response的HeaderString exportName = URLEncoder.encode(dto.getFileName() + ".zip", "utf-8");response.setContentType("application/octet-stream");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment; filename=" + exportName);response.setHeader("FileName", exportName);response.setHeader("Access-Control-Expose-Headers", "FileName");OutputStream out = response.getOutputStream();excelsToZip(out, attachmentPOList);out.close();} catch (IOException ex) {throw new BusinessException("导出压缩包失败");}}}     /*** 打压缩包导出*/private void excelsToZip(OutputStream out, List<AttachmentPO> list) throws RuntimeException {ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);compressExcel(zos, list);} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {if (zos != null) {try {zos.close();} catch (IOException e) {throw new BusinessException("关闭zip输出流失败");}}}}/*** 执行压缩*/private void compressExcel(ZipOutputStream zos, List<AttachmentPO> list) {if (CollectionUtils.isNotEmpty(list)) {for (AttachmentPO item : list) {byte[] buf = new byte[BUFFER_SIZE];Map<String, String> map = new HashMap<>();map.put("fileId", item.getAttachId());Response response = attachmentCilent.down(map);Response.Body body = response.body();try {InputStream in = body.asInputStream();zos.putNextEntry(new ZipEntry(item.getOldName()));int len;while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}zos.closeEntry();in.close();in.close();} catch (IOException e) {throw new BusinessException("执行压缩失败");}}}}

核心代码:

提供者:返回void,HttpServletResponse 写入
feign:应用提供者接口,返回改为Response(用feign.Response来接收)
消费者:调用feign,转为InputStream

Response response = attachmentCilent.down(map);
Response.Body body = response.body();
InputStream in = body.asInputStream();

参考:
https://www.jianshu.com/p/eeca093741ef?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

OpenFeign实现微服务间的文件下载相关推荐

  1. 再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!

    在微服务项目中,如果我们想实现服务间调用,一般会选择Feign.之前介绍过一款HTTP客户端工具Retrofit,配合SpringBoot非常好用!其实Retrofit不仅支持普通的HTTP调用,还能 ...

  2. Spring Boot微服务间文件返回实现

    Feign接口获取文件流问题_Java_wyazyf的博客-CSDN博客 https://blog.csdn.net/wyazyf/article/details/93200033 Spring Bo ...

  3. Istio:一个用于微服务间通信的服务网格开源项目

    http://www.infoq.com/cn/news/2017/05/istio Istio:一个用于微服务间通信的服务网格开源项目 Google.IBM和Lyft开源了微服务管理.保护和监控框架 ...

  4. dbnetlib不存在或拒绝访问_idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制...

    本文由华为云容器Istio团队撰稿,未经允许谢绝转载. 摘要 使用 Istio 可以很方便地实现微服务间的访问控制.本文演示了使用 Denier 适配器和黑白名单两种方法. 使用场景 有时需要对微服务 ...

  5. 实践《如何使用Seata保证Dubbo微服务间的一致性》

    原文在这里:如何使用Seata保证Dubbo微服务间的一致性. 从这里下载sample代码,master分支,最新的代码提交日期是2019.9.16,修订号cd10c5a.本文代码在模块dubbo里. ...

  6. 微服务间的调用和应用内调用有啥区别

    摘要 目前大部分的系统架构都是微服务架构,就算没有注册中心.服务管理,也肯定是多个服务,单体服务比较少了. 大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间的调用和应用内直接调用 ...

  7. 通过RestTemplate进行微服务间(通过服务名)的调用

    样例: @Slf4j @RestController @RequestMapping(path = "/test") public class TestController {@A ...

  8. 微服务间用户信息共享机制

    文章目录 前言 第一节 微服务间用户信息传递问题 第二节 解决思路 第三节 实践操作(基于Feign) 1. 调用链路说明 2. shop-common改造 3. 开启注解 4. 启动服务器测试 第四 ...

  9. Spring微服务间登录用户信息共享思路

    微服务之间使用feign的RequestInterceptor拦截器实现请求头传递当前登录用户信息:各线程中使用ThreadLocal存储数据:使用SpringAOP 在Controller类的方法增 ...

  10. spring cloud微服务间限流,使用jMeter性能测试高并发

    有关网关限流方式查看上一篇博客:spring cloud网关(zuul)限流,使用jMeter性能测试高并发 在网关限流后,有可能有些微服务与网关山的限流不一致,比如网关限流100QPS,而微服务只能 ...

最新文章

  1. C语言:constkeyword、结构体
  2. ASI和AFN的区别
  3. 通俗讲解傅里叶变换fft
  4. getsockname的使用
  5. 把本地仓库建到github
  6. 计算机管理员相关知识,计算机管理员述职报告范文
  7. Netty工作笔记0029---NIO 网络编程应用--群聊系统4--客户端编写2
  8. 计算机wps如何排序,wps怎么排序【解答方案】
  9. 修改后的RSA 加密解密 可用于制作liscence
  10. GPS(全球定位系统)
  11. VAD自适应算法降噪控制毕业论文【matlab】
  12. 一种MOS场效应管H桥电机驱动电路
  13. 百度界面代码及效果展示
  14. JSD-2204-API-线程API-线程锁-Day07
  15. Intellij IDEA 14 配置SVN
  16. 同步屏障Barrier
  17. Virgin Voyages将提供按需香槟配送服务“Shake for Champagne™”
  18. 二手房数据的分析与挖掘(七)-- 预测房价
  19. matlab 邻近度 离群点_Matlab 六章知识点及课后解答
  20. 易优CMS内核儿童教育培训机构网站模板源码

热门文章

  1. 二叉树非递归遍历方法总结
  2. 工业相机软件参数介绍
  3. 数据采集集成-网络数据采集(一)
  4. Android FFmpeg视频添加水印
  5. matlab 伽马校正曲线,【图像处理知识复习】02伽马校正matlab,C++实现
  6. 微信表白代码,单身汪们还不快收藏!
  7. 抖音海外版tiktok404 amp; 简洁国际版apk
  8. 提升手机麦克风音量_安卓手机音量调整办法(听筒、话筒、扬声器)
  9. Matlab图像处理系列4———图像傅立叶变换与反变换
  10. 云计算的工作原理是什么?