https://blog.csdn.net/qq_33878858/article/details/107763546
util文件夹
export function download(data: any, strFileName: string, strMimeType: string) {
var self = window as any, // this script is only for browsers anyway...
u = 'application/octet-stream', // this default mime also triggers iframe downloads
m = strMimeType || u,
x = data,
D = document,
a = D.createElement('a'),
z = function (a) {
return String(a);
},
B = self.Blob || self.MozBlob || self.WebKitBlob || z,
BB = self.MSBlobBuilder || self.WebKitBlobBuilder || self.BlobBuilder,
fn = strFileName || 'download',
blob,
b,
ua,
fr;
//if(typeof B.bind === 'function' ){ B=B.bind(self); }
if (String(this) === 'true') {
//reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback
x = [x, m];
m = x[0];
x = x[1];
}
//go ahead and download dataURLs right away
if (String(x).match(/^data\:[\w+\-]+\/[\w+\-]+[,;]/)) {
return navigator.msSaveBlob // IE10 can't do a[download], only Blobs:
? navigator.msSaveBlob(d2b(x), fn)
: saver(x); // everyone else can save dataURLs un-processed
} //end if dataURL passed?
try {
blob = x instanceof B ? x : new B([x], { type: m });
} catch (y) {
if (BB) {
b = new BB();
b.append([x]);
blob = b.getBlob(m); // the blob
}
}
function d2b(u) {
var p = u.split(/[:;,]/),
t = p[1],
dec = p[2] == 'base64' ? atob : decodeURIComponent,
bin = dec(p.pop()),
mx = bin.length,
i = 0,
uia = new Uint8Array(mx);
for (i; i < mx; ++i) uia[i] = bin.charCodeAt(i);
return new B([uia], { type: t });
}
function saver(url: string, winMode?: any) {
if ('download' in a) {
//html5 A[download]
a.href = url;
a.setAttribute('download', fn);
a.innerHTML = 'downloading...';
D.body.appendChild(a);
setTimeout(function () {
a.click();
D.body.removeChild(a);
if (winMode === true) {
setTimeout(function () {
self.URL.revokeObjectURL(a.href);
}, 250);
}
}, 66);
return true;
}
//do iframe dataURL download (old ch+FF):
var f = D.createElement('iframe');
D.body.appendChild(f);
if (!winMode) {
// force a mime that will download:
url = 'data:' + url.replace(/^data:([\w\/\-\+]+)/, u);
}
f.src = url;
setTimeout(function () {
D.body.removeChild(f);
}, 333);
} //end saver
if (navigator.msSaveBlob) {
// IE10+ : (has Blob, but not a[download] or URL)
return navigator.msSaveBlob(blob, fn);
}
if (self.URL) {
// simple fast and modern way using Blob and URL:
saver(self.URL.createObjectURL(blob), true);
} else {
// handle non-Blob()+non-URL browsers:
if (typeof blob === 'string' || blob.constructor === z) {
try {
return saver('data:' + m + ';base64,' + self.btoa(blob));
} catch (y) {
return saver('data:' + m + ',' + encodeURIComponent(blob));
}
}
// Blob but not URL:
fr = new FileReader();
fr.onload = function (e) {
saver(this.result);
};
fr.readAsDataURL(blob);
}
return true;
} /* end download() */
.vue文件
import { download } from '@/utils/download';
private async exportItem(id: number) {
const resp = await Fetch.get(``);
this.downloadfile(resp.url, 'demo.json');
}
// 浏览器下载json格式文件
private downloadfile(url: string, file_name: string) {
var xmlHttp: any = null;
if (window.ActiveXObject) {
// IE6, IE5 浏览器执行代码
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
} else if (window.XMLHttpRequest) {
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlHttp = new XMLHttpRequest();
}
//2.如果实例化成功,就调用open()方法:
if (xmlHttp != null) {
xmlHttp.open('get', url, true);
xmlHttp.send();
xmlHttp.onreadystatechange = doResult; //设置回调函数
}
function doResult() {
if (xmlHttp.readyState == 4) {
//4表示执行完成
if (xmlHttp.status == 200) {
//200表示执行成功
//引用js库:download.js
download(xmlHttp.responseText, file_name, 'text/plain');
}
}
}
}
第二种
利用a标签
download属性不止可以实现下载,其属性值还可以规定下载时的文件名,如果不填写,会自动使用默认文件名。
封装在utils
export function download (href: string, fileName: string) {
const a = document.createElement('a');
a.setAttribute('href', href);
a.setAttribute('download', fileName);
a.click();
}
import { download } from '@/utils/download';
download(resp.url,'');