目前,我在百度上,找到了三种方式,下载
第一种
这个方法,用的是FileReader然后readAsDataURL,我自己测试,会比方法二,下载速度要快一点
下面的代码段,可以替换,方法三种 download(blob, fileName)这一行
const a = document.createElement('a')
document.body.appendChild(a)
a.style.display = 'none'
FileReader主要用于将文件内容读入内存
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function(e) {
var a = document.createElement('a');
a.download = fileName;
a.href = e.target.result;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
第二种
这是最早我百度到的方法,后来,发现,大文件在下,需要很长的请求,因为转化成blob前,需要fecth去加载,我们提供的下载地址,加载的过程中,文件越大,越耗时间。所以转化blob也就耗时间,所以可以加loading
下面的代码段,可以替换,方法三种 download(blob, fileName)这一行
const a = document.createElement('a')
document.body.appendChild(a)
a.style.display = 'none'
const url = window.URL.createObjectURL(blob)
a.href = url
a.download = fileName
a.click()
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
第三种(融合了方法一和方法二,是一个npm包download.js)fetch是浏览器原生提供的一个ajax请求,类似于我们用的axios。我也用axios了。但是跨域了。
如果真的想用axios那用get方法吧,替换方法三种的fetch,post方法,我测试的时候,跨域.
axios.get(url,{responseType: 'blob'}).then(res => {
const blob = res.data
download(blob, fileName)
})
jsDownload (url, fileName) {
fetch(url).then(res => {
return res.blob()
}).then(blob => {
download(blob, fileName)
}).catch(err => {
console.log(err)
return false
}).finally(res => {
return true
})
},
download.js文件,可以复制,保存到项目里,直接import 就行
download.js的github地址。膜拜大佬