33 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
		
			
		
	
	
			33 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
|  | import { ElMessage, ElMessageBox } from "element-plus"; | |||
|  | import { getFileName, getFileSuffix, getFileUrl } from "../../utils/index.js"; | |||
|  | 
 | |||
|  | /** | |||
|  |  * @param {string} url - 文件的下载地址 URL | |||
|  |  * @param {string} [name] - 可选的文件名,不带后缀。若未提供,则从 URL 中提取文件名 | |||
|  |  * @returns {Promise<void>} 无返回值,但会触发浏览器下载行为 | |||
|  |  */ | |||
|  | export default async function useDownloadFile(url, name) { | |||
|  |   if (!url) throw new Error("没有下载地址"); | |||
|  |   await ElMessageBox.confirm("确定要下载此文件吗?", { type: "warning" }); | |||
|  |   const FILE_URL = getFileUrl(); | |||
|  |   if (name) { | |||
|  |     if (!getFileSuffix(url)) name = name + getFileSuffix(url); | |||
|  |   } else name = getFileName(url); | |||
|  |   fetch(url.indexOf(FILE_URL) === -1 ? FILE_URL + url : url) | |||
|  |     .then((res) => res.blob()) | |||
|  |     .then((blob) => { | |||
|  |       const a = document.createElement("a"); | |||
|  |       document.body.appendChild(a); | |||
|  |       a.style.display = "none"; | |||
|  |       const url = window.URL.createObjectURL(blob); | |||
|  |       a.href = url; | |||
|  |       a.download = `${name}`; | |||
|  |       a.click(); | |||
|  |       document.body.removeChild(a); | |||
|  |       window.URL.revokeObjectURL(url); | |||
|  |     }) | |||
|  |     .catch(() => { | |||
|  |       ElMessage.error("下载失败"); | |||
|  |     }); | |||
|  | } |