63 lines
1.9 KiB
JavaScript
63 lines
1.9 KiB
JavaScript
import { message } from "antd";
|
|
import dayjs from "dayjs";
|
|
import { useState } from "react";
|
|
import { getFileUrl } from "../../utils/index.js";
|
|
|
|
/**
|
|
* 下载Blob流文件
|
|
*/
|
|
export default function useDownloadBlob() {
|
|
// loading状态
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
// 下载Blob流文件
|
|
const downloadBlob = (url, options = { name: "", type: "", params: {} }) => {
|
|
setLoading(true);
|
|
const fileUrl = getFileUrl();
|
|
return new Promise((resolve, reject) => {
|
|
const finalUrl = !url.includes(fileUrl) ? fileUrl + url : url;
|
|
Object.entries(options.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: options.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
|
|
= options.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);
|
|
});
|
|
});
|
|
};
|
|
|
|
return [loading, downloadBlob];
|
|
}
|