前后端分离项目--下载功能

embedded/2024/9/24 22:34:59/

文章目录

    • 不使用代理服务器
      • blob
        • blob构造函数
        • 通过FormData对象的getBlob方法创建Blob对象
        • 将Blob对象转换成UR
    • 使用代理服务器

前后端分离项目中下载与其他接口的使用不同,一般下载不走node,不通过代理服务器,而是直接在前台发送请求,又因为前端使用的是代理服务器,会出现跨域问题,需要后端协助,允许下载文件接口跨域

不使用代理服务器

axios({method: 'GET',url: `url`,  // 后端下载接口headers: {token: token},params: {fileId: id},// 后端返回的是二进制数据,请求的响应类型为二进制数据,如果不加下载的文件是乱码responseType: 'blob'   
}).then(res => {let file = res.datalet disposition = (res.headers['content-disposition']).split('=')let filename = disposition[1] //文件名const blob = new Blob([file])let url = URL.createObjectURL(blob)// 创建下载链接let downloadLink = document.createElement('a');downloadLink.href = urldownloadLink.download = filename; // 设置文件名// 添加到页面并模拟点击下载renderingdocument.body.appendChild(downloadLink);downloadLink.click();// 清理下载链接document.body.removeChild(downloadLink);
}).catch(err => {console.log(err)})

blob

blob表示二进制的大对象。在数据库管理系统中,将二进制数据存储为一个单一个体的集合。在 JavaScript 中 Blob 类型的对象表示不可变的类似文件对象的原始数据。
Blob 对象含有两个属性:size 和 type。其中 size 属性用于表示数据的大小(以字节为单位),type 是一个字符串。

blob构造函数
const blob = new Blob([file])
通过FormData对象的getBlob方法创建Blob对象
const formData = new FormData();
formData.append('file', file);
const blob = formData.getBlob('file');
将Blob对象转换成UR
const url = URL.createObjectURL(blob)

使用代理服务器

如果用node,浏览器端还需要判断下载文件类型,从而添加对应的content-type和拓展名,如果后端返的全是200,还可能出现没有文件,下载下来是下图这样的
在这里插入图片描述浏览器端

function fileDownload() {const fileDwon = document.querySelectorAll('.fileDwon')console.log(fileDwon);fileDwon.forEach(function (value) {value.addEventListener('click', function () {let id = value.idconsole.log(id);download({method: 'GET',url: `/downLoadFile`,params: {id: id},responseType: 'blob',}).then(res => {let file = res.data;const blob = new Blob([file])let url = URL.createObjectURL(blob)console.log(blob);// 创建下载链接var downloadLink = document.createElement('a');downloadLink.href = urldownloadLink.download = `${res.headers.filename}.doc`; // 设置文件名// 添加到页面并模拟点击下载document.body.appendChild(downloadLink);downloadLink.click();// 清理下载链接URL.revokeObjectURL(url);document.body.removeChild(downloadLink);}).catch(err => {console.log(err)})})})
}

服务器端

// 下载文件
router.get('/downLoadFile', async (req, res) => {let fileId = req.query.idlet token = req.headers.tokenconst url = `http://123.57.144.143:8080/warmHeartDownload/downLoadFile`;try {const pipelineAsync = promisify(pipeline);const response = await fetch(url, {headers: {token},params: {fileId: fileId},});if (!response.ok) {console.error('获取失败');}await pipelineAsync(response.body, res);} catch (error) {console.error('Download error:', error);res.status(500).send('Error downloading file');}
})

http://www.ppmy.cn/embedded/114695.html

相关文章

基于SpringBoot+Vue的健身房管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

【24华为杯数模研赛赛题思路已出】国赛A题思路丨附参考代码丨免费分享

2024年华为杯研赛A题解题思路 A题 风电场有功功率优化分配 问题一:风机主轴及塔架疲劳损伤程度量化指标计算低复杂度模型 实际应用中,载荷(指主轴扭矩和塔架推力)数据随机性很强,且周期特征不标准,波峰波…

WPF TextBox 控件文本水平垂直居中

WPF TextBox 控件文本水平垂直居中 水平居中 HorizontalContentAlignment"Center"垂直居中 VerticalContentAlignment"Center"

Linux入门2

文章目录 一、Linux基本命令1.1 文件的创建和查看命令1.2 文件的复制移动删除等命令1.3 查找命令1.4 文件的筛选和管道的使用1.5 echo、tail和重定向符 二、via编辑器三、权限控制3.1 root用户(超级管理员)3.2 用户和用户组3.3 权限信息3.4 chmod命令 一…

在MAC中Ollama开放其他电脑访问

ollama安装完毕后默认只能在本地访问,之前我都是安装其他的软件之后可以结合开放其他端口访问,其实是可以新增或修改下电脑的系统配置,就可以打开端口允许除本机IP或localhost访问。 步骤如下: 1、查看端口(默认是&…

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

8.安卓逆向-安卓开发基础-安卓四大组件1

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

【Python 数据分析学习】Pandas的基础和应用(2)

题目 1 数据运算与分析1.1 算数和比较运算1.1.1 算数运算1.1.2 比较运算 1.2 数据排列1.3 统计分析1.3.1 基本的统计分析函数1.3.2 特殊的统计分析函数1.3.3 检查和处理空值 1.4 分组与聚合1.4.1 数据分组1.4.2 数据聚合 1.5 透视交叉表1.5.1 透视表1.5.2 交叉表 2 实战演练2.1…