65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 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 };
 | |
| }
 |