获取到接口地址 urlios
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', 'test.zip')
link.click()
复制代码
注意:关于 a 标签的 download 属性用法json
const link = document.createElement('iframe')
link.style.display = 'none'
link.src = url
// 注意 iframe 标签必须挂载到 dom 上,不然没法触发浏览器下载(也是缺点之一)
document.body.appendChild(link)
复制代码
步骤1 须要一个能将请求结果转换成 blob 流格式的 axios 实例,去请求该 urlaxios
(此处假设请求方式为 get 请求)api
注意:代码中几个比较重要的 api ( 摘取自 MDN )浏览器
(1). responseType:bash
XMLHttpRequest.responseType属性是一个枚举类型的属性,返回响应数据的类型。它容许咱们手动的设置返回数据的类型。若是咱们将它设置为一个空字符串,它将使用默认的"text"类型。服务器
在工做环境 (Work Environment) 中将 responseType 的值设置为 "document" 一般会被忽略. 当将 responseType 设置为一个特定的类型时,你须要确保服务器所返回的类型和你所设置的返回值类型是兼容的。那么若是二者类型不兼容呢?恭喜你,你会发现服务器返回的数据变成了 null ,即便服务器返回了数据。还有一个要注意的是,给一个同步请求设置 responseType 会抛出一个 InvalidAccessError 的异常。网络
responseType 支持如下几种值:app
(2). FileReader:dom
FileReader 对象容许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
(3). HTTP Header:
content-type 根据实际请求头判断, 普通数据请求中会返回 'application/json; charset=utf-8'
步骤2 须要一个文件转换的方法 blobToFile( blob, fileName )
思路是:根据请求返回的 blob 对象,利用 URL.createObjectURL() 得到该文件二进制流的 URL对象,而后再执行新建 a 标签,执行点击(这里与第一种 a 标签方法相似),最后释放这个 URL对象)
步骤3 调用请求下载方法,并执行文件转换,即:
// 引入相关文件
import { DOWNLOAD_GET } from './API/get'
import blobToFile from from '@/utils/blobToFile'
// methods
getDownLoadFile() {
return DOWNLOAD_GET(`${url}`)
}
async downLoadFile() {
// this.url 是这个文件的地址
// this.fileName 是这个文件的文件名,这里稍后补充如何自动填入
try {
const blob = await this.getDownFile(this.url)
blobToFile(blob, this.fileName)
}
}
复制代码