方式一:采用插件去做,在ts文件中引入download.js(download.js)
import * as download from '../../../../assets/download/download.js';
downloadImg(){
var x=new XMLHttpRequest();
x.open("GET", "http://danml.com/wave2.gif", true);
x.responseType = 'blob';
x.onload=function(e){download(x.response, "dlBinAjax.gif", "image/gif" ); }
x.send()
}
这样下载会遇到跨域问题,解决如下:
downloadIamg(imgUrl, imgName) {
var x = new XMLHttpRequest();
x.open("GET", imgUrl, true);
// x.setRequestHeader("access-control-allow-headers", "Authorization,Content-Type,Depth,User-Agent,X-File-Size,X-Requested-With,X-Requested-By,If-Modified-Since,X-File-Name,X-File-Type,Cache-Control,Origin")
// x.setRequestHeader("access-control-allow-methods", "GET,POST,OPTIONS,PUT,DELETE")
x.setRequestHeader("Access-Control-Allow-Origin", "*")
// x.setRequestHeader("access-control-expose-headers", "Authorization")
x.setRequestHeader("Cache-Control","no-cache")
x.responseType = 'blob';
x.onload = function (e) { download(x.response, imgName + '.png', "image/png"); }
x.send();
}
方式二:采用XMLHttpRequest,把下面内容放入公共文件进行函数封装
let url = ""; // 要下载的文件地址
let type = 'octet-stream';
let xhr = new XMLHttpRequest();
xhr.open('get', url, true);
// 修改请求头,用户登录后返回的token值,根据项目需求可加可不加
xhr.setRequestHeader('Authorization', localStorage.getItem('Token'));
xhr.setRequestHeader('Content-Type', `application/${type}`);
xhr.responseType = "blob";
xhr.onload = function () {
// status请求状态码,此函数是回调,可带参数
if (this.status == 200) {
// 接受二进制文件流
var blob = this.response;
let downloadElement = document.createElement('a');
let href = blob;
if (typeof blob == 'string') {
downloadElement.target = '_blank';
else {
href = window.URL.createObjectURL(blob); // 创建下载的链接
}
downloadElement.href = href;
if(fileName){
downloadElement.download = fileName; // 下载后文件名
}
document.body.appendChild(downloadElement);
downloadElement.click(); // 点击下载
document.body.removeChild(downloadElement); // 下载完成移除元素
if (typeof blob != 'string') {
window.URL.revokeObjectURL(href); // 释放掉blob对象
}
}
}
xhr.send();