zy-react-library/hooks/useDownloadBlob/index.js

63 lines
1.8 KiB
JavaScript
Raw Normal View History

2025-10-22 14:43:42 +08:00
import { message } from "antd";
import dayjs from "dayjs";
import { useState } from "react";
2025-10-22 14:43:42 +08:00
/**
* 下载Blob流文件
*/
export default function useDownloadBlob() {
// loading状态
const [loading, setLoading] = useState(false);
// 下载Blob流文件
2025-10-30 17:38:25 +08:00
const downloadBlob = (url, options) => {
setLoading(true);
2025-10-30 17:38:25 +08:00
return new Promise((resolve, reject) => {
2025-10-30 17:38:25 +08:00
const { name= "", type= "", params= {} } = options
const finalUrl = (process.env.app.API_HOST || window.__JJB_ENVIRONMENT__.API_HOST) + url;
2025-10-30 17:38:25 +08:00
Object.entries(params).forEach(([key, value]) => {
finalUrl.searchParams.append(key, value);
});
fetch(finalUrl, {
method: "GET",
mode: "cors",
headers: {
"Content-Type": "application/json",
},
2025-10-22 14:43:42 +08:00
})
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.blob();
})
.then((blob) => {
const finalBlob = new Blob([blob], {
2025-10-30 17:38:25 +08:00
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
2025-10-30 17:38:25 +08:00
= 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);
2025-10-22 14:43:42 +08:00
});
});
};
return [loading, downloadBlob];
2025-10-22 14:43:42 +08:00
}