|
|
|
|
|
import axios from "axios";
|
|
|
|
|
|
import { getToken } from "@/utils/auth";
|
|
|
|
|
|
import { Loading, Message } from "element-ui";
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
* @params {string} url 请求拼接地址
|
|
|
|
|
|
* @params {object} info 请求参数params或data
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
let loading;
|
|
|
|
|
|
export async function download(url, method = "get", info, filename) {
|
|
|
|
|
|
loading = Loading.service({
|
|
|
|
|
|
lock: true,
|
|
|
|
|
|
background: "rgba(0,0,0,0.4)",
|
|
|
|
|
|
text: "文件正在生成中...",
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
let options = {
|
|
|
|
|
|
baseURL: process.env.VUE_APP_BASE_API,
|
|
|
|
|
|
url,
|
|
|
|
|
|
method,
|
|
|
|
|
|
responseType: "blob",
|
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
Accept: "application/json",
|
|
|
|
|
|
"Content-Type": "application/json; charset=utf-8",
|
|
|
|
|
|
withCredentials: true,
|
|
|
|
|
|
Authorization: "Bearer " + getToken(),
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
if (method === "get") {
|
|
|
|
|
|
Object.defineProperty(options, "params", {
|
|
|
|
|
|
value: info,
|
|
|
|
|
|
enumerable: true,
|
|
|
|
|
|
writable: false,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
if (method === "post") {
|
|
|
|
|
|
Object.defineProperty(options, "data", {
|
|
|
|
|
|
value: info,
|
|
|
|
|
|
enumerable: true,
|
|
|
|
|
|
writable: false,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
const response = await axios.request(options);
|
|
|
|
|
|
|
|
|
|
|
|
loading.close();
|
|
|
|
|
|
|
|
|
|
|
|
// 提取文件名
|
|
|
|
|
|
if (!filename) {
|
|
|
|
|
|
filename =
|
|
|
|
|
|
response.headers["content-disposition"]?.match(/filename=(.*)/)[1] ||
|
|
|
|
|
|
"";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将二进制流转为blob
|
|
|
|
|
|
const blob = new Blob([response.data], {
|
|
|
|
|
|
type: "application/octet-stream",
|
|
|
|
|
|
});
|
|
|
|
|
|
if (typeof window.navigator.msSaveBlob !== "undefined") {
|
|
|
|
|
|
// 兼容IE,window.navigator.msSaveBlob:以本地方式保存文件
|
|
|
|
|
|
window.navigator.msSaveBlob(blob, decodeURI(filename));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 创建新的URL并指向File对象或者Blob对象的地址
|
|
|
|
|
|
const blobURL = window.URL.createObjectURL(blob);
|
|
|
|
|
|
// 创建a标签,用于跳转至下载链接
|
|
|
|
|
|
const tempLink = document.createElement("a");
|
|
|
|
|
|
tempLink.style.display = "none";
|
|
|
|
|
|
tempLink.href = blobURL;
|
|
|
|
|
|
tempLink.setAttribute("download", decodeURI(filename));
|
|
|
|
|
|
// 兼容:某些浏览器不支持HTML5的download属性
|
|
|
|
|
|
if (typeof tempLink.download === "undefined") {
|
|
|
|
|
|
tempLink.setAttribute("target", "_blank");
|
|
|
|
|
|
}
|
|
|
|
|
|
// 挂载a标签
|
|
|
|
|
|
document.body.appendChild(tempLink);
|
|
|
|
|
|
tempLink.click();
|
|
|
|
|
|
document.body.removeChild(tempLink);
|
|
|
|
|
|
// 释放blob URL地址
|
|
|
|
|
|
window.URL.revokeObjectURL(blobURL);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
console.error(err);
|
|
|
|
|
|
loading.close();
|
|
|
|
|
|
Message({
|
|
|
|
|
|
type: "error",
|
|
|
|
|
|
message: err,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|