68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 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) => {
 | 
						|
      if (!url)
 | 
						|
        return reject(new Error("请传入 url"));
 | 
						|
 | 
						|
      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 };
 | 
						|
}
 |