当前位置: 首页 > news >正文

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

文章目录

    • 不使用代理服务器
      • 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');}
})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于高通主板的ARM架构服务器
  • 【自然语言处理】实验三:新冠病毒的FAQ问答系统
  • Golang | Leetcode Golang题解之第406题根据身高重建队列
  • linux服务器配置及服务器资源命令使用查看
  • 【鸿蒙应用】总结一下ArkUI
  • 力扣题解2848
  • 【C语言】分支和循环(下)
  • C语言指针和数组梳理
  • opencv之图像轮廓(三)--凸包
  • Unity SRP 可编程渲染管线的基本用法
  • Python——俄罗斯方块
  • 『功能项目』切换职业面板【48】
  • 笔试强训day13
  • MySQL索引-聚簇索引和非聚簇索引
  • Android 11 FileProvider的使用和限制
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android优雅地处理按钮重复点击
  • CSS魔法堂:Absolute Positioning就这个样
  • Java面向对象及其三大特征
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • scala基础语法(二)
  • ViewService——一种保证客户端与服务端同步的方法
  • 关于Java中分层中遇到的一些问题
  • 聊聊redis的数据结构的应用
  • 如何设计一个比特币钱包服务
  • 突破自己的技术思维
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 译米田引理
  • ​决定德拉瓦州地区版图的关键历史事件
  • # Apache SeaTunnel 究竟是什么?
  • #if 1...#endif
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2)STL算法之元素计数
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (力扣题库)跳跃游戏II(c++)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (算法)大数的进制转换
  • (一)Docker基本介绍
  • .describe() python_Python-Win32com-Excel
  • .NET 8.0 发布到 IIS
  • .net core 6 redis操作类
  • .NET Core跨平台微服务学习资源
  • .NET MVC第三章、三种传值方式
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net2005怎么读string形的xml,不是xml文件。
  • @Autowired @Resource @Qualifier的区别
  • @Builder用法
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @ModelAttribute使用详解