工具篇--Spring-Cloud--feign 通过feign 接口完成文件的下载

文章目录

  • 前言
  • 一、feign接口获取文件流程:
  • 二、文件获取实现
    • 2.1 引入jar:
    • 2.2 实现:
  • 总结


前言

通常在spring-boot 项目中,对于文件的下载都是直接调用到对应的服务中,而不是通过feign 接口获取文件;有时我们在对接外部接口时,因为权限等问题,不能直接暴露文件服务,会有一个专门对外的服务进行对接,但是我们又要利用现有的文件服务逻辑,此时可以考虑使用feign 完成文件的获取。


一、feign接口获取文件流程:

我们知道feign 只是通过动态代理为我们构建了http 的请求,显然我们不能通过feign 接口直接把 HttpServletResponse 传过去,因为feign接口服务的提供者,接收到的HttpServletResponse 和我们通过feign 接口传入的压根儿就不是同一个对象,所以此时我们只能在文件服务中返回文件流,然后在将文件流 写入到最开始HttpServletResponse 对象中,最后返回给浏览器,流程大概如下:
在这里插入图片描述

二、文件获取实现

2.1 引入jar:

因为我们是web 服务并且使用了feign 接口所有这个两个jar 依赖是必须要有的:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2 实现:

(1) feign 接口:

@GetMapping(value = "/osp/download/{id}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
ResponseEntity<Resource> download(@PathVariable("id") String id);

(2)feign 接口服务提供者:
控制器:

import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;@GetMapping("/osp/download/{id}")public ResponseEntity<Resource> ospDownloadFile(@PathVariable String id) throws Exception {return xxxService.ospDownloadFile(id);}

xxxService 对应自己业务里面的实现;实现类:

 @Override
public ResponseEntity<org.springframework.core.io.Resource> ospDownloadFile(String id) throws Exception {// 这里获取自己业务中的文件FileRecord fileRecord = fileRecordService.selectCache(id);if (null == fileRecord)throw new Exception("文件不存在");InputStream inputStream = null;ByteArrayOutputStream outputStream = null;try {inputStream = getObjectInputStream(fileRecord.getCodeName());outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, length);}byte[] byteArray = outputStream.toByteArray();// 读取文件内容ByteArrayResource resource = new ByteArrayResource(byteArray);// 设置响应头HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileRecord.getName());// 返回响应实体return ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource);} finally {if (null != inputStream) {inputStream.close();}if (null != outputStream) {outputStream.close();}}}

(3)对外服务端:
对外服务控制器:

@GetMapping("/file/download/{id}")
public void download(@PathVariable String id,HttpServletResponse response) throws Exception {ospFlowService.ospDownLoadFile(id,response);
}

业务实现类:

 @Override
public void ospDownLoadFile(String id,  HttpServletResponse response) throws Exception {// feign 接口获取文件流ResponseEntity<Resource> fileResponse = remoteFileService.download(id);// 设置响应头response.setHeader(HttpHeaders.CONTENT_DISPOSITION, fileResponse.getHeaders().get(HttpHeaders.CONTENT_DISPOSITION).get(0));response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);// 从 Feign 响应中获取文件输入流,并写入到 HttpServletResponse 输出流中InputStream inputStream = fileResponse.getBody().getInputStream();OutputStream output = response.getOutputStream();IoUtil.copy(inputStream, output);// 将流刷新给到浏览器response.flushBuffer();}

这里使用cn.hutool.core.io 中的 IoUtil 工具类,有需要的可以引入

 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>
</dependency>

总结

本文通过feign 接口完成文件的下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2661351.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习Day23 (Leetcode/Python-回溯算法)

46. Permutations Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. Example 1: Input: nums [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路&#xff1a;此题可用回溯…

SpringBoot 项目中常用的注解

每一层对应每个包&#xff0c;包名中应全为小写。 一、Common 层&#xff08;实体类&#xff09; 前提&#xff1a;导入 Lombok 依赖 Data&#xff1a;生成 get 和 set 方法以及 toString 方法 Getter&#xff1a;只生成 get 方法&#xff0c;避免对类中的成员变量修改。 …

中国人事考试网公布多项考试成绩:注安、一造在列

12月29日&#xff0c;中国人事考试网公布多项职业资格考试成绩&#xff0c;包括大家心心念念想的注册安全工程师、一级造价工程师考试成绩&#xff0c;公告发布的今天&#xff0c;考生即可登录中国人事考试网查询考试成绩。 较早发布的是注册安全工程师考试成绩&#xff08;成绩…

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

信息泄露总结

文章目录 一、备份文件下载1.1 网站源码1.2 bak文件泄露1.3 vim缓存1.4 .DS_Store 二、Git泄露2.1 git知识点2.1 log2.2 stash 三、SVN泄露3.1 SVN简介3.2 SVN的文件3.3 SVN利用 四、Hg泄露 一、备份文件下载 1.1 网站源码 常见的网站源码备份文件后缀&#xff1a; tartar.gz…

2024年医院设备维修培训安排

在你还考虑该不该干的时候别人已经走好远了 小时候觉得忘带作业是天大的事&#xff0c;高中的时候&#xff0c;觉得考不上大学是天大的事&#xff0c;恋爱的时候&#xff0c;觉得跟喜欢的人分开是天大的事&#xff0c;到现在回头看看&#xff0c;那些难以跨过的山&#xff0c;…

ssm基于HTML和JS物资物流系统的设计与实现+vue论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对物资物流信息管理的提升&#x…

切面编程的理解和使用,Java小白入门(五)

我们进入ruoyi-framework,立刻看到的内容 了解一下aspectj 这个概念 概念 面向切面编程&#xff08;AOP&#xff09; 面向切面编程&#xff08;AOP&#xff09;是一种编程范式&#xff0c;重点聚焦于软件应用程序中的关注点分离。AOP 背后的思想是软件应用程序具有多个切面&a…

CSDN,你的服务器挂了

浏览器访问一些文章&#xff0c;访问不到&#xff1a;https://blog.csdn.net/qq_40389276/article/details/99709890

未来编程语言什么样?编译解释兼容方为王

○、编程语言的未来&#xff1f; 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; …

基于人类反馈的强化学习(RLHF)

1. 监督微调&#xff08;SFT&#xff09;&#xff1a;为了训练语言模型&#xff08;LM&#xff09;掌握基本的任务执行技能&#xff0c;首先需要构建一个监督数据集。这个数据集包含了指令性的输入提示和期望的输出结果&#xff0c;通过这些数据对LM进行精细调整。为了保证任务…

C#中的Attribute详解(上)

C#中的Attribute详解&#xff08;上&#xff09; 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute&#xff0c;为了区分这四类静态方法&#xff0c;我们只能通过注释来说明&#xff0c;但这样做会给系统带来很多…

突破PHP disable_functions方法

1. 利用 LD_PRELOAD 环境变量 知识扫盲 LD_PRELOAD&#xff1a;是Linux系统的一个环境变量&#xff0c;它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()&#xff1a;PHP函数&#xff0c;可以设置环境变量mail()&#xff0c;error_log()&#xff1a;PHP函数&…

Python面向对象高级与Python的异常、模块以及包管理

Python面向对象高级与Python的异常、模块以及包管理 一、Python中的继承 1、什么是继承 我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型…

模式识别与机器学习-半监督学习

模式识别与机器学习-半监督学习 半监督学习半监督学习的三个假设半监督学习算法自学习算法自学习的步骤&#xff1a;自学习的优缺点&#xff1a;优点&#xff1a;缺点&#xff1a; 协同训练多视角学习生成模型半监督SVM 谨以此博客作为复习期间的记录 半监督学习 半监督学习&…

浅谈安科瑞智能照明系统在马来西亚国家石油公司项目的应用

摘要&#xff1a;随着社会经济的发展及网络技术、通信技术的提高&#xff0c;人们对照明设计提出了新的要求&#xff0c;它不仅要控制照明光源的发光时间、 亮度&#xff0c;而且与其它系统来配合不同的应用场合做出相应的灯光场景。本文介绍了马亚西亚石油公司智能照明项目的应…

大数据前馈神经网络解密:深入理解人工智能的基石

文章目录 大数据前馈神经网络解密&#xff1a;深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函…

蓝牙物联网智能安防系统设计方案

1概述 安防系统(安全防护)的作用是预防损失&#xff0c;是人们保障人身和财产安全最重要的工具之一。近年来&#xff0c;伴随经济的飞速发展和城市人口的急剧增加&#xff0c;盗窃、入室抢劫等事件的增多给人们的安定生活带来了很大的影响&#xff0c;同时&#xff0c;交通的快…

three.js绘制网波浪

无图不欢&#xff0c;先上图 使用方法&#xff08;以vue3为例&#xff09; <template><div class"net" ref"net"></div> </template><script setup> import { ref, onMounted } from vue import NetAnimation from /utils…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…