前端项目是如何实现文件下载的?

前端项目是如何实现文件下载的?

在业务开发中,我想大多数同学可能会遇到关于实现文件下载这方面的需求,例如说通过点击某一个小按钮或者标签来实现触发浏览器的下载功能

这里我先使用koa2作为后端,起一个小小的Demo

在这个Demo中我写了一个请求文件流的Api,当客户端向这个Api进行请求数据后,服务器端会返回一个File

接下来是前端部分了,我们用pnpm create vite快速起一个项目,这里我就不再演示这个过程了

我简单的写了一个按钮并绑定了对应的请求函数,我们来看看network中报文会返回什么数据

原来是跨域了,我们在vite.config.ts中处理一下,通过设置代理的方式来解决跨域问题

接下来,我再请求一次看看

现在,服务器也将我们想要的文件返回的过来,但是作为用户我是要下载这个文件,而不是在请求中看到这个文件的内容

我们预期是效果应该是通过浏览器来下载这个文件

问题不大,我们写一个小小的函数简单的解决这个问题

typescript 复制代码
function streamToDownloadFile(data: BlobPart, filename: string,type: string= 'application/octet-stream') {
  let blob = new Blob([data], { type });
  let url = window.URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  // 重命名文件
  link.download = filename;
  link.click();
  URL.revokeObjectURL(url);
}

const download = () => {
  console.log('download');
  axios.get('/api/download/foo').then(res => {
    // 触发浏览器下载机制
    streamToDownloadFile(res.data, 'foo.txt')
  })
}

注意,download属性是HTML5的新特性

这样子我们的问题就解决了,当用户点击"下载文件"时,浏览器会自动把文件下载到客户端上面

在代码中我们写了一个streamToDownloadFile函数,实现了将文件数据转换为可下载的文件并触发下载操作

主要步骤分为:

  1. 通过外部传入的文件数据和类型创建一个Blob对象
  2. 利用createObjectURL创建临时url,引用Blob对象的内容
  3. 创建a标签,设定href和download属性
  4. 通过click事件,触发浏览器下载机制
  5. 最后,使用revokeObjectURL释放之前创建的临时URL,以防止内存泄漏

返回链接下载

除了后端返回文件流的方式,后端也可以返回一个文件地址给前端,然后前端根据文件地址请求触发浏览器下载

我们来模拟一下,这个场景

配置一下koa2静态文件访问,需要安装pnpm add koa-static这个包来实现静态资源的问题

这里,我们会遇到一个比较常见的问题,在pdftxtjpg等文件用a标签直接用href属性,是不能实现下载功能的,浏览器会直接识别并显示这些文件

我们再写一个返回sheet.xlsx文件的地址的Api提供给前端使用

我们在前端请求下这个Api,我们可以得到一个对象,包括文件名,下载文件链接(有点废话..)

这种情况下,我们要采用和上面一样的方法去处理这些格式文件去下载,所以我们这里把文件改为xlsx文件进行测试

因为我的电脑上之前的安装了迅雷的扩展,所以默认有下载任务会被迅雷接管下载

这样,我们就实现了通过URL的方式来下载文件

相比前面通过文件流下载文件的方式,这个方法会比较简单一些,不过有时候可能也会出现一些小Bug,例如跳转后没有下载问题,而是打开文件

Demo地址:file-download-demo

相关推荐
晓得迷路了5 小时前
栗子前端技术周刊第 119 期 - ViteLand 月度更新汇总、Angular 21.2、Bun v1.3.10...
前端·javascript·vite
鹏多多5 小时前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter
拉不动的猪5 小时前
重温Vue异步更新队列
前端·javascript·面试
Mike_jia5 小时前
OpenClaw:开源个人AI助手的“执行革命“
前端
摸鱼的春哥6 小时前
吃龙虾🦞咯!万字拆解OpenClaw的架构与设计
前端·javascript·后端
恋猫de小郭6 小时前
什么 AI 写 Android 最好用?官方做了一个基准测试排名
android·前端·flutter
anOnion15 小时前
构建无障碍组件之Switch Pattern
前端·html·交互设计
华洛15 小时前
多写点skill吧,写的越多这行业死的越快。
前端·javascript·产品
剪刀石头布啊15 小时前
从函数式编程介绍
前端
vjmap16 小时前
全新唯杰WebCAD编辑平台发布:全面拥抱AI,WebCAD智能体(Agent)来了
前端·gis·ai编程