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

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

下层服务返回文件流 (即文件下载)

@GetMapping(value = "/v1/files/**/{file_name:.+}")public void downFile(@PathVariable("file_name") String fileName, HttpServletResponse response, HttpServletRequest request) {
//        String uploadPath = IFlieServiceRpc.findByStrategyKey(uploadDir);String url = request.getServletPath();//获取urlurl = url.substring(url.lastIndexOf("files")).replace("files/", "");String uploadPath = null;String os = OSNameUtil.getOSname();if ("Windows".equals(os)) {uploadPath = winuploadDir;} else if ("Linux".equals(os)) {uploadPath = linuxuploadDir;}//截取时间戳String filename = "";//不带时间戳的文件名String ownFilePathString = "";//自定义文件路径if (url.lastIndexOf("/") > 0) {filename = url.substring(url.lastIndexOf("/") + 1);ownFilePathString = url.substring(0, url.lastIndexOf("/") + 1);} else {filename = url;}if (filename.indexOf("_") > 0) {filename = filename.substring(filename.indexOf("_") + 1);}String path = uploadPath + File.separator + url;String path1 = uploadPath + File.separator + ownFilePathString + filename;//判断文件是否存在File file2 = new File(path);if (!file2.exists()) {LOGGER.equals("文件不存在");throw new SBRException("文件不存在");}String getSm4Key = null;try {getSm4Key = PropertyUtil.getProperty("sm4");if (getSm4Key != null && !"".equals(getSm4Key)) {SM4Utils.decryptFile(path, path1, getSm4Key);} else {renameFile(path, path1);//path1=path;}} catch (IOException e1) {if (getSm4Key != null && !"".equals(getSm4Key)) {//解析后的文件需要删除File file = new File(path1);file.delete();}LOGGER.error("获取sm4报错,错误原因:" + e1);throw new SBRException("获取sm4报错,错误原因:" + e1);}File file = new File(path1);FileInputStream fis =null;try {if (file.exists()) {response.setHeader("Content-Disposition","attachment;filename=" + new String((file.getName()).getBytes("GB2312"), "ISO8859-1"));response.setContentLength((int) file.length());response.setContentType("application/octet-stream");// 定义输出类型fis = new FileInputStream(file);BufferedInputStream buff = new BufferedInputStream(fis);byte[] b = new byte[1024];// 相当于我们的缓存long k = 0;// 该值用于计算当前实际下载了多少字节OutputStream myout = response.getOutputStream();// 从response对象中得到输出流,准备下载// 开始循环下载while (k < file.length()) {int j = buff.read(b, 0, 1024);k += j;myout.write(b, 0, j);}myout.flush();myout.close();buff.close();if (getSm4Key != null && !"".equals(getSm4Key)) {file.delete();}}} catch (Exception e) {if (getSm4Key != null && !"".equals(getSm4Key)) {//解析后的文件需要删除file.delete();}LOGGER.error("文件下载流错误,错误原因:" + e);throw new SBRException("文件下载流错误,错误原因:" + e);} finally {if(fis!=null){try {fis.close();fis=null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}try {if (getSm4Key == null && "".equals(getSm4Key)) {//没加密的文件需要处理renameFile(path1, path);}} catch (IOException e) {LOGGER.error("重命名失败,失败原因:" + e);throw new SBRException("重命名失败,失败原因:" + e);}}}

上下层服务间Feign接口调用

import feign.Response;@FeignClient("prometheus-file")
public interface FileFeignClient {@GetMapping(value = "/file/api//v1/files/{file_name}",consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)Response downFile(@PathVariable("file_name") String fileName);
}

上层服务把下层服务的文件流返回给前端 (实现浏览器中文件下载)

    @GetMapping("/file/download")public void downloadProject(HttpServletResponse httpServletResponse)throws IOException {ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();InputStream inputStream = feignBody.asInputStream();Response feignResponse = genAtomicFeign.downFile("file_name");Response.Body feignBody = feignResponse.body();feignResponse.headers().forEach((String key, Collection<String> value) -> {httpServletResponse.setHeader(key, ((LinkedList<String>) value).get(0));});byte[] c = new byte[1024];int length;while ((length = inputStream.read(c)) > 0) {servletOutputStream.write(c, 0, length);}servletOutputStream.flush();servletOutputStream.close();}

上层服务把下层服务的文件流保存为本地文件


/*** 将文件写入随机文件,并返回路径* @param fileName 文件名称* @return*/public String  getFilePath(String fileName){InputStream inputStream = null;//获得文件流Response response =fileFeignClient.downFile(fileName);Response.Body body = response.body();String filePath ="";FileOutputStream fos = null;try {//获取response中的文件流inputStream = body.asInputStream();
//            byte[] b = new byte[inputStream.available()];
//            inputStream.read(b);//临时目录String folder=System.getProperty("java.io.tmpdir");int random = (int)(1+Math.random()*(10-1+1));String sj = String.valueOf(DateUtil.getCurrentDate().getTime());//临时路径+文件名称filePath = folder + sj+random+fileName.substring(fileName.lastIndexOf("."));//写入文件fos= new FileOutputStream(filePath);byte[] c = new byte[1024];int length;while((length= inputStream.read(c))>0){fos.write(c,0,length);}} catch (IOException e1) {e1.printStackTrace();}finally{try {inputStream.close();} catch (IOException e) {e.printStackTrace();}try {fos.close();} catch (IOException e) {e.printStackTrace();}}return filePath;}

Spring Boot微服务间文件返回实现相关推荐

  1. Docker容器及Spring Boot微服务应用

    2019独角兽企业重金招聘Python工程师标准>>> Docker容器及Spring Boot微服务应用 1 什么是Docker 1.1 Docker的出现 问题一:项目实施环境复 ...

  2. Spring Boot 微服务编码风格指南和最佳实践

    文奇摄于世界尽头州立公园 通过多年来使用 Spring Boot 微服务,我编制了一份编码风格指南和最佳实践列表.这份清单并不全面,但我希望您能找到一两点可以借鉴的地方,无论您是新手还是经验丰富的 S ...

  3. spring boot 微服务集群 + 注册中心

    spring boot 微服务框架下载地址: https://start.spring.io/ 注册中心 Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进 ...

  4. Spring Boot微服务的黑匣子测试是如此简单

    当我需要进行原型设计,概念验证或在空闲时间使用一些新技术时,开始新项目对于Maven来说总是有点烦人. 不得不说,设置Maven项目并不难,您可以使用Maven原型. 但是原型通常是过时的. 谁想玩旧 ...

  5. Docker基础篇 - (六)Docker 网络Spring Boot微服务打包Docker镜像

    ⑦ Docker 网络 7.1 理解Docker0 清空下前面的docker 镜像.容器 # 删除全部容器 [root@cVzhanshi tomcat-diy]# docker rm -f $(do ...

  6. 高级版的 jvisualvm :Spring Boot Admin 监控 Spring Boot 微服务项目

    前奏:先说一下 Java VisualVM Java VisualVM 是一个能够监控 JVM 的 jdk 自带的图形化工具: 在 $JAVA_HOME/bin 目录下,可直接运行它. 要想监控远程服 ...

  7. spring boot微服务项目搭建

    第一章 SpringBoot介绍 1 简介 Spring Boot是一个便捷搭建基于spring工程的脚手架:作用是帮助开发人员快速搭建大型的spring 项目.简化工程的配置和依赖管理:开发人员把时 ...

  8. springboot 微服务_使用 Docker 部署 Spring Boot微服务

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  9. spring boot 微服务入门

    微服务:微服务是一种微服务架构思想的一种,在传统应用软件上的架构基础上,将系统业务按照功能拆分为更细的粒度的服务,每一个服务都是一个独立的应用,这些应用对外提供公共的API,可以独立承担对外的职责.通 ...

最新文章

  1. Dockerfile镜像优化方案指引
  2. 无线通信 -- 跳频技术
  3. Java - 文件(IO流)
  4. python中beautifulsoup是什么_Python中的BeautifulSoup – 获取类型的第n个标记
  5. 使用Node.js 搭建静态服务器
  6. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
  7. Excel 设置数字以万为单位显示以更准确地表达数目
  8. Sequential Recommendation with Self-Attentive Multi-Adversarial Network
  9. js vue+elementui 全屏跟退出全屏功能搬砖
  10. MATLAB回归分析命令——regress命令
  11. gc java ibm_月光软件站 - 编程文档 - Java - IBM JVM 1.4.1 GC与内存管理
  12. 用 Python 绘制个人足迹地图
  13. a上标3下标6算法_a上标3下标6算法_Word中同时设置上标下标
  14. 软件测试自动化验证码,借助 OCR,协助绕过 web 自动化测试中一些简单验证码问题。...
  15. 基于pyqt5开发的图书管理系统UI(带登录页面)
  16. [vue]开源一个精致完整的Vue项目(豆瓣)
  17. 继承属性:定义交通工具类Vehicle,一个小车类Car,一个公共汽车Bus类,实现Car、Bus对Vehicle的继承
  18. bios设置 联想m8000t_联想M8000T系统重启解决办法
  19. [Xamarin.Android] 不同分辨率下的图片使用概论
  20. CES Asia直击:像飞机的水下机器人你见过吗

热门文章

  1. 吐血分享:QQ群霸屏技术(初级篇)
  2. 区块链之《Chia 技术架构》
  3. 【附源码】计算机毕业设计SSM网络相册设计
  4. 计算机毕设Node.js+Vue幸福小区健身器材租赁系统(程序+LW+部署)
  5. 蹭下ChatGPT的热度哈哈
  6. win7 修复计算机要多久,系统修复,教您win7系统要怎么修复
  7. 文字居中、CSS中实现盒子水平垂直居中的方法
  8. AUTH_USER_MODEL refers to model报错解决
  9. 数字孪生技术解决方案助力智慧核电建设
  10. Flutter 时间戳格式化日期,仿微信显示