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

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

文章目录

    • 不使用代理服务器
      • 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.data
    let 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 = url
    downloadLink.download = filename; // 设置文件名
    // 添加到页面并模拟点击下载rendering
    document.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.id
            console.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 = url
                downloadLink.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.id
    let token = req.headers.token
    const 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.kler.cn/news/313426.html

相关文章:

  • 移植Linux:如何制作rootfs?
  • 相机畸变系数$b_1,b_2$与畸变系数aspect ratio和skew的互转
  • css scrollbar-width: none 隐藏默认滚动条
  • WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容
  • MyBatis 源码解析:TypeHandler 设计与自定义实现
  • ★pwn 更改pwn题libc保姆级教程★
  • SpringBoot+Thymeleaf图书管理系统
  • Go语言并发模式详解:深入理解管道与上下文的高级用法
  • 集群聊天服务器项目【C++】项目介绍和环境搭建
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77
  • 缓存预热方案详解
  • 论文笔记:交替单模态适应的多模态表征学习
  • WebLogic 后台弱⼝令GetShell
  • WPF入门教学四 WPF控件概述
  • opencv中读取图片、视频以及对其基本操作
  • 关系型数据库,NoSQL和内存数据库三种数据库的比较
  • OpenCV库学习之NMSBoxes函数
  • ubuntu如何进行自动mount硬盘(简易法)
  • Ansible——Playbook基本功能???
  • TortoiseSVN图标不显示的解决
  • 网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作
  • 实习期间git的分枝管理以及最常用的命令
  • PyCharm 安装教程
  • C#+EmguCV合并视频文件
  • Qt Linguist 短语书批量导入翻译.ts导入.qph
  • kubernetes技术详解,带你深入了解k8s
  • 汽车应用生态系统的飞跃
  • Docker 华为云镜像加速器配置
  • Imagen架构详解:理解其背后的技术与创新
  • 大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同