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

2024-06-04 2335阅读

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

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

    一、a 标签下载

    1、直接html使用a标签下载
    • href:文件链接
    • download:下载时的文件名称,相当于重命名了,可以不设置该属性
      下载
      
      2、通过js方法借用a标签下载
      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
      downloadFile(fileurl) {
          window.location.href = fileurl
      }
      
      2、window.open
      downloadFile(fileurl) {
          window.open(fileurl)
      }
      

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

      三、blob下载流文件

      1、引入axios

      import axios from 'axios'
      

      2、blob下载

      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
              })
          },
      

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]