美文网首页
前端下载文件

前端下载文件

作者: 许小花花 | 来源:发表于2021-05-10 12:08 被阅读0次

文件下载是在开发中常见的一种需求,下面是在实际项目中使用的下载方案,记录一下

一、打开新页面下载文件

这是最简单的一种下载方案,通过打开新窗口的方法触发浏览器自带的下载功能,可以这样做

const url = "aaaa" // 后端提供的下载接口
// 1、通过window.open打开新窗口
window.open(url); // 打开新窗口,默认的target参数为_blank,在新窗口打开,也可以设置为_self之类的

// 2、也可以通过a标签打开新窗口
const a = document.createElement("a");
a.href = "aaaa";
a.download = "filename"; // 对比与window下载,特点在于可以设置下载下来的文件名
a.click();

这种方案是最简单的,但是弊端也很多:

  • 1、对于部分浏览器可以直接展示的文件类型,比如音乐、视频、图片等,浏览器就不会执行下载操作,而是直接进行展示(由responseContent-Type字段判断类型,image/pngimage/jpeg 等浏览器可以直接识别打开的文件,这样就不会执行下载事件。而像octet-stream的二进制流数据,则是无法直接预览的)
  • 2、当接口访问异常或者参数问题等出现错误时,无法进行错误捕获,而是直接在新窗口显示出接口的报错信息,交互体验差
    综上,这是一种简单,需保证接口调用结果正常,且在特定某些文件类型下可以使用的下载方案

二、通过文件流下载

这种方案主要分为两步,第一获取文件,第二下载文件

1、获取文件

获取文件主要是将请求接口返回的结果设置/转化为Blob(Binary Large Object): 二进制大数据对象或者ArrayBuffer(又称类型化数组)

// 原生ajax
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = "blob"; // 设置返回结果为Blob对象
return new Promise(reslove => {
  xhr.onload = () => {
      if(xhr.status === 200) {
        reslove(xhr.response)  
      }  
  }
})
xhr.send();

// axios
return new Promise((resolve, reject) => {
        axios({
            method:'get',
            url,
            responseType: 'arraybuffer' // 也可以设置为blob
        }).then(data => {
            resolve(data.data)
        }).catch(error => {
            reject(error.toString())
        })
    })

// fetch
return new Promise(reslove => {
    fetch(url, { 
                method: "POST",
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(params)}).then(res => {
      res.blob().then(data => {
        reslove(data);
      })
    })
})

2、下载文件

获取文件以后,就可以开始下载文件

getFile().then(blob => { // file就是上面获取到的filedata
  const a = document.createElement('a');
  const url = window.URL.createObjectURL(blob);
  a.href = url;
  a.download = "fileName" ; // 设置下载下来的文件名
  a.click();
  window.URL.revokeObjectURL(url); // 释放通过调用 URL.createObjectURL() 创建的 URL 对象
})

这样一个文件就可以下载下来了

相关文章

  • 文件上传与下载

    文件上传 前端页面 Action处理类 struts.xml 文件下载 前端页面 处理下载请求的action st...

  • js blob导出文件 文件下载 中文乱码的问题

    需求:后端文件以二进制流的形式返回给前端, 前端需要读取流文件实现文件下载。 场景:下载成功,文件乱码。 原因:与...

  • 前端文件下载

    最近做项目遇到要把文件放在前端项目中,然后点击下载完整代码: 先把文件放在静态目录src/assets里面 通过i...

  • Vue-纯前端导出word文档

    在项目中,我们可以借助后端返回文件流实现文件下载。如果前端有数据,也可以借助前端框架进行下载。本文将介绍如何在前端...

  • Vue-纯前端导出word文档

    在项目中,我们可以借助后端返回文件流实现文件下载。如果前端有数据,也可以借助前端框架进行下载。本文将介绍如何在前端...

  • 前端下载文件无法打开

    前端下载文件无法打开 在开发过程中遇到下载功能,后端直接从服务器拉文件是可以打开的,前端通过接口下载的文件打开报错...

  • xlsx.js excel文件下载

    excel 文件的下载 前端 后端导出 excel

  • 前端下载文件

    前端创建下载窗口 流文件下载 接口 如果返回的是网址

  • 前端下载文件而不是打开预览(支持 doc / excel / p

    前端根据后台返回的文件地址(非跨域),实现点击下载文件 a 标签下载文件,download属性可以实现对下载文件的...

  • 关于前端下载的常用问题

    关于前端下载的常用问题 1.前端利用a标签下载文件报文件格式于要拓展名不匹配 原因://import'@/moc...

网友评论

      本文标题:前端下载文件

      本文链接:https://www.haomeiwen.com/subject/jrzbdltx.html