53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 
								 | 
							
								import { message } from "antd";
							 | 
						||
| 
								 | 
							
								import dayjs from "dayjs";
							 | 
						||
| 
								 | 
							
								import { getFileUrl } from "../../utils/index.js";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 下载Blob流文件
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								export default function useDownloadBlob(
							 | 
						||
| 
								 | 
							
								  url,
							 | 
						||
| 
								 | 
							
								  options = { name: "", type: "", params: {} },
							 | 
						||
| 
								 | 
							
								) {
							 | 
						||
| 
								 | 
							
								  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);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 |