前端下载文件的方法-blob下载

前端经常会遇到下载文件的需求,后端一般提供的以下两种方法:

  • 文件地址。后端直接提供要下载的文件地址,常用于图片、音视频等静态文件
  • 文件流。后端返回文件流,常用于excel等动态文件

一、a 标签下载

1、直接html使用a标签下载
  • href:文件链接
  • download:下载时的文件名称,相当于重命名了,可以不设置该属性
html 复制代码
<a href="https://example.com/images/a.png" download="b.png">下载</a>
2、通过js方法借用a标签下载
javascript 复制代码
downloadFile(fileurl) {
    let a = document.createElement('a')   // 创建一个a标签
    a.href = fileurl                      // 赋值链接
    a.style.display = 'none'              // 隐藏,设置元素不可见
    document.body.appendChild(a)          // 添加a到页面
    a.click()                             // 模拟点击,进行跳转或下载操作
    document.body.removeChild(a)          // 操作完成,移除a
}

二、window 下载

1、window.location.href
javascript 复制代码
downloadFile(fileurl) {
    window.location.href = fileurl
}
2、window.open
javascript 复制代码
downloadFile(fileurl) {
    window.open(fileurl)
}

注: window.open() 可能会被浏览器拦截器屏蔽,而 window.location.href 不会受到影响

三、blob下载流文件

1、引入axios

javascript 复制代码
import axios from 'axios'

2、blob下载

javascript 复制代码
downloadFile() {
    // 文件地址,可携带参数
    const fileurl = `/file/example/excel/abc?id=${this.id}&appId=${this.appId}`
    // 请求并下载文件,可设置 headers
    axios
       .get(fileurl, {
           responseType: 'blob', // 必须,指定响应的数据类型为二进制数据流(Blob对象)
           headers: {
              'X-Auto-Fp-Plate': 'example',
           },
        })
        .then(response => {
            let url = window.URL.createObjectURL(response.data) // 将二进制文件转化为可访问的url
            let a = document.createElement('a')
            a.href = url
            a.style.display = 'none'
            document.body.appendChild(a)
            // 一般在响应头的 content-disposition 里设置文件名称,下面是提取文件名示例
            const arr = response.headers['content-disposition'].split('filename=')
            const fileName = decodeURI(arr[arr.length - 1])
            a.download = fileName  // 将获取的文件名赋值过去,也可自行赋值
            a.click()
            document.body.removeChild(a)
            window.URL.revokeObjectURL(url) // 释放url
        })
        .catch(error => {
            // do something
        })
    },
相关推荐
Dream-Y.ocean2 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn2 小时前
性能监控
前端
Highcharts.js3 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn3 小时前
构建工具
前端
FRing033 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen6 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒6 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫6 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus7 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬8 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端