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

【vue3】vue3+express实现图片/pdf等资源文件的下载

文件资源的下载,是我们业务开发中常见的需求。作为前端开发,学习下如何自己使用node的express框架来实现资源的下载操作。

实现效果

请添加图片描述
请添加图片描述

代码实现

  • 前端

1.封装的请求后端下载接口的方法,需求配置aixos的请求参数里面的返回数据类型为blob

// 下载
export function downLoad(name) {return instance.get(`/course/download?name=${name}`, {responseType: "blob",});
}

2.下载的核心方法,这里不能直接后端返回给我们的资源url,因为对于图片和pdf文件,浏览器的首选操作是预览,不是下载本地,所以我们这里需要转换下数据格式。

const downloadSource = async (item) => {const data = await downLoad(item.attachments);const blob = new Blob([data]);let filename = item.name;const fileUrl = item.attachments;const extname = fileUrl.substring(fileUrl.lastIndexOf(".") + 1);filename = filename + "." + extname;const link = document.createElement("a");link.download = filename;link.target = "_blank";link.style.display = "none";link.href = URL.createObjectURL(blob);document.body.appendChild(link);link.click();URL.revokeObjectURL(link.href);document.body.removeChild(link);
};

3.后端响应的数据格式
在这里插入图片描述

  • 后端
    1.模拟数据
    在这里插入图片描述

2.后端接口方法,"Content-Disposition这个响应头表示资源是需要下载的,如果含有中文可能会报错,解决方法是只需要我们encodeURIComponent转译就行了。

//下载资料
const imagePath = (name) => path.join(__dirname, `../public/images/${name}`);
const downloadFile = (req, res, next) => {// console.log("🚀 ~ fs.readFile ~ imagePath:", req.query.name);const nameArr = req.query.name.split("/");fs.readFile(imagePath(nameArr[nameArr.length - 1]), (err, buffer) => {if (err) {res.status(500).send("Error reading image");return;}// 设置响应头switch (req.query.name) {case "pdf":res.setHeader("Content-Type", "application/pdf");break;default:res.setHeader("Content-Type", "image/jpeg");}// 设置响应头res.setHeader("Content-Type", "application/pdf");res.setHeader("Content-Disposition",`attachment; filename=${encodeURIComponent(nameArr[nameArr.length - 1])}`);// 发送图片数据res.send(buffer);});
};

在这里插入图片描述
3.配置请求方法路径
在这里插入图片描述
这样我们就实现了图片,pdf等资源的下载。这里只演示了图片和资源两种文件类型,其余的类型是一样的原理,可以自行添加测试。

相关文章:

  • 埃文科技助力山西公共数据运营新发展
  • 关于 人工智能(AI)发展简史 的详细梳理,按时间阶段划分,涵盖关键里程碑、技术突破、重要人物及挑战
  • QuickAPI 全生命周期管理:从开发到退役的闭环实践​
  • 告别繁琐,拥抱简洁:初识 Pytest 与环境搭建 (Pytest系列之一)
  • vue3 elementPlus中el-tree-select封装和自定义模糊搜索
  • 大数据学习(108)-子查询
  • #苍穹外卖#(day3-4)
  • Verilog的整数除法
  • 【FPGA】——DDS信号发生器设计
  • 单位门户网站被攻击后的安全防护策略
  • P12130 [蓝桥杯 2025 省 B] 移动距离
  • Python Django基于协同过滤算法的招聘信息推荐系统【附源码、文档说明】
  • 深入解析TCP Keep-Alive机制:原理、作用与最佳实践
  • SSM考研助手管理系统
  • 基于MFC 的链接库
  • vue项目打包部署到maven仓库
  • 如何针对游戏、金融行业定制CC攻击防护规则?
  • 如何配置环境变量HADOOP_HOMEM、AVEN_HOME?不配置会怎么样
  • RCEP框架下eBay日本站选品战略重构:五维解析关税红利机遇
  • java使用 ​Stream 流对自定义对象数组去重的
  • 云南洱源县4.8级地震:房屋受损442户,无人员伤亡报告
  • 北京顺义:做好潮白河大桥事故善后处置,举一反三排查风险
  • 上海楼市明显复苏:一季度房地产开发投资增长5.1%,土地市场重燃战火
  • 展讯:漫游者秦龙和巫鸿的三本书
  • 稀土管制难倒特斯拉人形机器人“擎天柱”,马斯克:“正与中国协商”
  • 书信里的宋人|忠奸难辨的夏竦