SpringBoot微服务项目,转发并响应下载请求

news/2025/1/22 6:58:37/

在微服务项目中,我经常会碰到从一个微服务项目转发下载请求并实现下载文件的需求,因此在此做一个转发下载的示例。总的下载转发流程如下,我会按照这个流程一一介绍下载流程。

 1、客户端的下载请求

这里主要介绍controller层是如何接收客户端发送请求的代码,接收参数的代码如下

@GetMapping(value = "downloadFile")
public void downloadFile( HttpServletResponse response) {}

2、转发服务器的下载请求

转发服务器的下载请求主要通过Feign接口实现,具体实现代码如下:

Feign接口:

    @PostMapping(value = "/downloadFile")Response downloadFile();

Feign接口实现类:

    @Overridepublic Response downloadFile() {return null;}

之后便可以利用Feign实现转发了controller层代码完善如下:

@GetMapping(value = "downloadFile")
public void downloadFile( HttpServletResponse response) {InputStream inputStream = null;try {Response serviceResponse = queryBranchService.downloadFile(url,sapNo);} catch (IOException e) {e.printStackTrace();}}

 

3、最终服务器的下载请求响应

该代码的总体思路就是将文件变成输出流并写在响应中,并返回给转发服务器。

    @GetMapping(value = "downloadFile")public void downloadFile(HttpServletResponse response) {//获取upload文件夹的路径try {InputStream contentInput = OkHttpClientUtils.getImage(url, null);BufferedInputStream bufferedInputStream = new BufferedInputStream(contentInput);response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(sapNo+".png", "UTF-8"));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());int length = 0;byte[] temp = new byte[1024 * 10];while ((length = bufferedInputStream.read(temp)) != -1) {bufferedOutputStream.write(temp, 0, length);}bufferedOutputStream.flush();bufferedOutputStream.close();bufferedInputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();log.error(e.getMessage());} catch (IOException e) {e.printStackTrace();log.error(e.getMessage());}}

4、转发服务器的下载请求响应

对转发服务器的controller层再继续完善,完善的总思路拿到中转服务器的响应,并拿出响应中输入流再变成输出流回写给客户端

@GetMapping(value = "downloadFile")
public void downloadFile( HttpServletResponse response) {InputStream inputStream = null;try {InputStream inputStream = null;try {Response serviceResponse = queryBranchService.downloadFile();Response.Body body = serviceResponse.body();inputStream = body.asInputStream();BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);response.setHeader("Content-Disposition", serviceResponse.headers().get("Content-Disposition").toString().replace("[", "").replace("]", ""));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());int length = 0;byte[] temp = new byte[1024 * 10];while ((length = bufferedInputStream.read(temp)) != -1) {bufferedOutputStream.write(temp, 0, length);}bufferedOutputStream.flush();bufferedOutputStream.close();bufferedInputStream.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}


http://www.ppmy.cn/news/21892.html

相关文章

LeetCode做题记录

开个博客记录自己刷LeetCode的心得体会,也是为了监督自己每天刷题,欢迎互相监督,每日至少5道题!!! 2023.2.2 ps.今晚临时起意开始写博客记录,时间不够写五道题了😂2.3号开始&#…

基于SPM 算法 BOW 算法的 Cifar-10 数据集图像分类实战 附完整代码数据集

基于 Beyond Bags of Features: Spatial Pyramid Matching for Recognizing Natural Scene Categories 中提出的 SPM 算法。由于 SPM 算法是对 BOW 模型的改进,因此我同样也实现了 BOW 算法,为了比较,我将这两个算法应用于 Cifar-10 数据集,测试其分类效果。 实现 我复现是…

stream操作常用API 示例详解

简介 从JDK8开始,增加了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑。 流式操作主要用来处理数据(比如集合),…

Django的信号机制解读

Django的信号 Django的信号机制不同于Linux的信号机制,Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django的信号主要包含以下三个要素: 发送者(sender&#xff0…

mongo常用语句

连接mongo mongo --port=12000 使用某个数据库 use fund-data 看所有的表 show tables; / show collections; 查询某个collection db.agg_manager_word_cloud.findOne(); 查看库的大小 use xxxdbname db.stats(); 也可以, 每个库的大小 show dbs; 表的大小:统计信息 db.agg…

MongoDB Map Reduce

在用 MongoDB 查询时,若返回的数据量很大,或者做一些比较复杂的统计和聚合操作做花费的时间很长时,可以使用 MongoDB 中的 mapReduce 进行实现。mapReduce 是个灵活且强大的数据聚合工具,它的好处是可以把一个聚合任务分解为多个小…

国际标准下载的几个网站 请点赞收藏

名称以ITU开头的国际标准下载网站名称以ITU开头的国际标准,是国际电信联盟组织制定的国际标准。国际电信联盟组织简称国际电联。它的官网是http://www.itu.int。 通过在这个网站下输入标准的部门名称就可以搜索下载电信标准。已ITU Q.763为例打开官网输入标准名称点…

Go 项目(一)

目录基础环境包管理编码规范命名规范注释import 规范错误处理RPC内置 RPC改协议改调用基础 基础部分参考这个系列接下来的这部分是对上面的更新和重构,更加深入理解框架部分 环境 基础环境,主要在Linux上搞;最主要是 docker,do…