downloadDefaultExcelTemplate() {
      const url = process.env.BASE_API + '/sys/get_account_begin_temp/'
      const a = document.createElement('a')
      // 使用fetch方法获取response.headers响应头
      fetch(url).then(res => {
        console.log('res', res)
        // 切割出文件名
        const fileNameEncode = res.headers.get('content-disposition').split('filename=')[1]
        // 解码
        const fileName = decodeURIComponent(fileNameEncode)
        console.log('fileName', fileName)
        // 使用blob()方法获取blob对象数据
        res.blob().then(
          res => {
            console.log('bolbs', res)
            // 设置type类型
            const blob = new Blob([res], {
              type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; application/octet-stream'
            const fileUrl = window.URL.createObjectURL(blob)
            a.href = fileUrl
            console.log('url', fileUrl)
            a.setAttribute('download', fileName)
            a.style.display = 'none'
            a.click()
            a.remove()

这里使用fetch()去调用,是因为需要拿到响应头。而我们项目封装的api,经过响应拦截,直接返回的是response.data。拿不到response的话,就没法拿到其中的headers。为了不影响全局的api使用,就对下载文件的方法,单独使用fetch来处理。

注意事项:
fetch(url).then( res => res.blob() ) .then( blob =>{ } )
fetch()的第一个then回调返回的是response,第二个then返回的才是后端的数据。
但考虑到我需要获取文件名,并进行分割,解码等操作。所以我直接在fetch()的第一个then里获取response之后进行代码逻辑的编写。我们需要将response转为blob对象数据,可以使用res.blob()方法。
decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

const blob = res.blob( ) // 这种写法是错误的,取到的是undefined
它的回调res才是真正想要的blob数据
res.blob().then(res=>{
console.log(‘blob值:’,res)
})

在进行Web开发时,可能遇到遇到以下几种需求:l          希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框。l          希望客户端下载时以指定文件名显示。l          希望某文件直接在浏览器上显示而不是弹出文件下载对话框。对于上面的需求,使用Content-Disposition属性 备注fetch兼容性:https://www.cnblogs.com/lhyxq/p/9779076.html。// 参数 下载url、上传url、文件名称、文件类型。// 参数 下载url、文件名称、文件URL。// 参数 下载url、文件名称。 文章目录前言一、认识Fetch1.1、介绍Fetch1.2、Fetch初次使用(查看response)二、Fetch使用2.1、使用Fetch()来得到响应数据(默认GET请求)2.2、Fetch()中的第二个参数(配置fetch) 本篇博客是介绍Fetch使用,若文章中出现相关问题,请指出! 所有博客文件目录索引:博客目录索引(持续更新) 一、认识Fetch 1.1、介绍Fetch Fetch也是前后端通信的一种方式。 优点:Fetch是Ajax(XMLHttpRequest)的一种替代方案,默认 由于项目使用的是 apipost ,所以在使用的时候还要设置 isReturnNativeResponse -是否返回本机响应,一般可能设置 responseType: 'blob' 就可以了。//这里只把这个响应里的data返回回来了,所以取不到headers,想要全部信息就return response;响应首部 Access-Control-Expose-Headers 就是控制“暴露”的开关,它列出了哪些首部可以作为响应的一部分暴露给外部。这个时候就能在前端获取响应的数据了。 ……所有这些都没有重新加载页面! 对于来自 JavaScript 的网络请求,有一个总称术语 “AJAX”(Asynchronous JavaScript And XML 的简称)。但是,我们不必使用 XML:这个术语诞生于很久以前,所以这个词一直在那儿。 有很多方式可以向服务器发送网络请求,并从服务器获取信息。 fetch Fetch API 是一种 JavaScript API,允许我们发送网络请求,并在接收响应后进行处理。它可以用于向服务器请求数据,上传数据或发送其他类型的请求。与 XMLHTTPRequest 相比,Fetch API 具有以下特点:更简洁的 API:只需要一个函数就可以完成网络请求。基于 Promise:支持更直观的异步编程。内置 Request 和 Response 类:方便进行请求和响应的处理。支持跨域请求:允许在不同域名之间进行数据交互。 这个过程其实就是使用Fetch去模拟a标签的下载过程,代码示例如下: <script> fetch('http://somehost/somefile.zip').then( res => res.bob() ).then(blob => { let a = document.createElement('a'); let url = window.URL.createObjectURL(blob); 说道fetch就不得不提XMLHttpRequest了,XHR在发送web请求时需要开发者配置相关请求信息和成功后的回调,尽管开发者只关心请求成功后的业务处理,但是也要配置其他繁琐内容,导致配置和调用比较混乱,也不符合关注分离的原则;fetch的出现正是为了解决XHR存在的这些问题。例如下面代码: fetch(url).then... 转载:前后端数据交互(四)——fetch 请求详解 - 前端人 - 博客园 fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpRequest 更加简洁。所以我们告别XMLHttpRequest,引入 fetch 如何使用? 一、fetch介绍 fetch() 是一个全局方法,提供一种简单,合理的方式跨网络获取资源。它的请求是基于 Promise 的,需要详细学习 P success: (data) => { /* do something with the data */ }, error: (err) => { /* do something when an error happens */}