后端接口返回文件流,前端下载(java+vue)

ops/2024/12/22 21:12:18/

在这里插入图片描述

各位小伙伴们大家好,欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展,在这个系列专栏中记录了博主在学习期间总结的大块知识点,以及日常工作中遇到的各种技术点 ┗|`O′|┛

?? 内容速览

本身前端是可以直接通过文件的url对文件进行下载的,但是在进行业务对接开发的时候,前端没有获取文件下载的权限,所以需要后端获取文件之后把获得的文件流传给前端前端通过文件流下载文件。

后端获取

controller层

/*** 根据附件id返回文件流*/
@ApiOperation(value = "根据附件id返回文件流", notes = "传入附件id")
@PostMapping(value = "/getByFileId")
public void getByFileId(HttpServletResponse response, @RequestBody FileIdReq fileIdReq) {matterBasicInfoService.getByFileId(response, fileIdReq.getFileId());
}

service接口

void getByFileId(HttpServletResponse response, String fileId);

实现类

@Override
public void getByFileId(HttpServletResponse response, String fileId) {// 获取附件详情  主要是要附件的url和名字MatterAttachmentFormOdr matterAttachmentFormOdr = matterAttachmentFormOdrService.getById(fileId);log.error("matterAttachmentFormOdr-----:{}", matterAttachmentFormOdr);if (BeanUtil.isEmpty(matterAttachmentFormOdr) || StrUtil.isBlank(matterAttachmentFormOdr.getUrl())) {throw new BusinessValidationException("该文件不存在");}// 附件url替换  如果url可以直接下载的话可以跳过这一步String filePath = matterAttachmentFormOdr.getUrl().replace("......", "......");log.error("filePath-----:{}", filePath);ServletOutputStream out = null;InputStream inputStream = null;try {//与服务器建立连接URL url = new URL(filePath);URLConnection conn = url.openConnection();inputStream = conn.getInputStream();try {//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setContentType("multipart/form-data");response.addHeader("Content-Disposition", "attachment; filename=" + matterAttachmentFormOdr.getName());} catch (Exception e){e.printStackTrace();}out = response.getOutputStream();// 读取文件流int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}log.error("读取文件流结束。。。。。。。");} catch (Exception e){e.printStackTrace();} finally {try {if (out != null) {out.flush();out.close();}if (inputStream != null) {inputStream.close();}} catch (IOException e) {throw new RuntimeException(e);}}
}

前端下载

handleGetFile(file) {const type = file.url.split('.')['1']if (!file.id) {this.$Message.warning('文件下载失败!')return}// 定义参数const data = { data: {fileId: file.id,},access_token: xxxxxx,}// 调用后端接口this.$store.dispatch('comprehensive/getByFileId', data).then(res => {this.$Message.loading(`正在下载${file.name}数据`)const applicationType = this.getFileTypeMime(type)const blob = new Blob([res.data], { type: applicationType })const link = document.createElement('a')const href = window.URL.createObjectURL(blob) // 创建下载的链接link.href = hreflink.download = `${file.name}` // 下载后文件名document.body.appendChild(link)link.click() // 点击下载document.body.removeChild(link) // 下载完成移除元素window.URL.revokeObjectURL(href) // 释放掉blob对象})
},

http://www.ppmy.cn/ops/144122.html

相关文章

VSCode中的Black Formatter没有生效的解决办法

说明 如果正常按照配置进行的话,理论上是可以生效的。 "[python]": {"editor.defaultFormatter": "ms-python.black-formatter","editor.formatOnSave": true }但我在一种情况下发现不能生效,应为其本身的bug…

QT图像处理:QImage与QPixmap

图像表示和图像处理概述 颜色数据格式 图像数据可以看作是二维数组,数组每个元素就是1 像素的颜色数据,在绘图设备上显示图像就是设置每个像素的颜色。任何颜色在显像时都是红色、绿色、蓝色三原色的组合。 颜色数据表示格式有以下几种: R…

【工具变量】中国数字经济发展水平面板数据DID(2012-2022)

数据来源:《中国统计年鉴》、国家统计局 时间跨度:2012-2022年 数据范围:中国各省 包含指标: 1. 地区 2. id 3. 年份 4. 互联网域名数 5. 互联网接入端口数 6. 互联网宽带接入用户数 7. 移动基站密度 8. 移动电…

基于ceres优化的3d激光雷达开源算法

以下是一些基于CERES优化的开源激光雷达SLAM或相关算法: (1) LOAM (Lidar Odometry And Mapping) 简介: LOAM是一种经典的激光雷达里程计和建图算法,它通过提取特征点(角点和平面点),利用ICP(Iterative Cl…

金智塔科技喜获CCF中国数字金融大会 GraphRAG竞赛二等奖

12月7日,CCF 首届中国数字金融大会GraphRAG竞赛在上海落下帷幕,金智塔科技(团队名称:塔塔向前冲)从众多参赛队伍中脱颖而出,喜获二等奖。 CCF 首届中国数字金融大会由中国计算机学会主办,中国计…

ParrotOS,一个与kali类似的渗透测试操作系统

介绍 Parrot Security(ParrotOS,Parrot)是一个基于 Debian Stable 的免费开源 GNU/Linux 发行版,专为安全专家、开发人员和注重隐私的人设计。 它包括一个完整的便携式武器库,用于 IT 安全和数字取证操作。它还包括开…

《 QT 5.14.1 类库模块列表详述》

《 QT 5.14.1 类库模块列表详述》 一、引言(一)简述 QT 5.14.1 类库的重要性(二) QT 5.14.1 基本模块列表 二、QT 5.14.1 基本模块(一)Qt Core 模块(二)Qt GUI 模块(三&a…

SAGA 软件阴影计算功能介绍

自动化地球科学分析系统(SAGA GIS)是一种地理信息系统(GIS)计算机程序,用于编辑空间数据。它是免费的开源软件,最初由德国哥廷根大学自然地理系的一个小团队开发,现在由国际开发人员社区进行维护…