import { message } from "antd"; import dayjs from "dayjs"; import { useState } from "react"; /** * 下载Blob流文件 */ export default function useDownloadBlob(returnType = "object") { // loading状态 const [loading, setLoading] = useState(false); // 下载Blob流文件 const downloadBlob = (url, options) => { setLoading(true); return new Promise((resolve, reject) => { const { name = "", type = "", params = {} } = options; const finalUrl = (process.env.app.API_HOST || window.__JJB_ENVIRONMENT__.API_HOST) + url; Object.entries(params).forEach(([key, value]) => { finalUrl.searchParams.append(key, value); }); fetch(finalUrl, { method: "GET", mode: "cors", headers: { "Content-Type": "application/json", }, }) .then((response) => { if (!response.ok) { throw new Error("Network response was not ok"); } return response.blob(); }) .then((blob) => { const finalBlob = new Blob([blob], { type: type || "application/vnd.ms-excel", }); const downloadElement = document.createElement("a"); const href = window.URL.createObjectURL(finalBlob); downloadElement.style.display = "none"; downloadElement.href = href; downloadElement.download = name || dayjs().format("YYYY-MM-DD HH:mm:ss"); document.body.appendChild(downloadElement); downloadElement.click(); document.body.removeChild(downloadElement); window.URL.revokeObjectURL(href); resolve({ data: finalBlob }); }) .catch((err) => { message.error("导出失败"); reject(err); }) .finally(() => { setLoading(false); }); }); }; if (returnType === "array") return [loading, downloadBlob]; return { loading, downloadBlob }; }