// 导出操作相关的方法
// 数据导出功能
async function downloadData(httpUrl, params, fileName, type = "application/vnd.ms-excel") {
console.log("数据导出中……");
const data = await httpUrl(params);
const fileTypeList = ["application/vnd.ms-excel", "application/force-download", "application/octet-stream"];
return new Promise((resolve, reject) => {
if (data && fileTypeList.indexOf(data.type) > -1) {
const blob = new Blob([data], {
type,
});
if (!!window.ActiveXObject || "ActiveXObject" in window) {
navigator.msSaveBlob(blob, fileName);
} else {
let link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.setAttribute("download", fileName);
link.click();
link = null;
}
resolve();
} else {
console.log("暂无可以导出的数据");
reject(new Error("暂无可以导出的数据!"));
}
});
}
// 根据url下载图片
const downImage = (imgsrc) => {
let image = new Image();
image.src = `${imgsrc}?v=${Math.random()}`; // 处理缓存
image.crossOrigin = "*"; // 支持跨域图片
image.onload = function () {
let canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
let ctx = canvas.getContext("2d");
ctx.drawImage(image, 0, 0, image.width, image.height);
let base64 = canvas.toDataURL("image/png");
let tmpa = document.createElement("a");
tmpa.download = base64;
tmpa.href = base64; // 绑定a标签
tmpa.target = base64; // 绑定a标签
tmpa.click(); // 模拟点击实现下载
};
};
/**
* 根据图片的url转换对应的base64值
* @param { String } imageUrl 如:http://xxxx/xxx.png
* @returns base64取值
* @Note 注意:可能涉及图片访问有跨域问题,让后台解决即可。
*/
const urlToBase64 = (imageUrl) => new Promise((resolve, reject) => {
let canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
let img = new Image();
img.crossOrigin = "Anonymous"; // 解决Canvas.toDataURL 图片跨域问题
img.src = imageUrl;
img.onload = function () {
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0, img.width, img.height); // 参数可自定义
const dataURL = canvas.toDataURL("image/jpeg", 1); // 获取Base64编码
resolve(dataURL);
canvas = null; // 清除canvas元素
img = null; // 清除img元素
};
img.onerror = function () {
reject(new Error(`Could not load image at ${imageUrl}`));
};
});
// 实现文件下载并重命名。主要解决,不同源情况的下载
/**
* 获取 blob
* url 目标文件地址
*/
const getBlob = (url) =>
new Promise((resolve) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.response);
}
};
xhr.send();
});
/**
* 保存 blob
* filename 想要保存的文件名称
*/
const saveAs = (blob, filename) => {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
const link = document.createElement("a");
const body = document.querySelector("body");
link.href = window.URL.createObjectURL(blob);
link.download = filename;
// fix Firefox
link.style.display = "none";
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
};
const downloadFile = (url, filename) => {
getBlob(url).then((blob) => {
saveAs(blob, filename);
});
};
export { downloadData, urlToBase64, downImage, downloadFile };