{"version":3,"file":"upload.mjs","names":[],"sources":["../../../../src/components/upload/utils/upload.ts"],"sourcesContent":["import { ElMessage } from \"element-plus\";\nimport { FaMimeType } from \"../../../constants\";\ntype UploadData = Record<string, string | Blob | [string | Blob, string] | string[]>;\n\ninterface UploadRequestConfig {\n\tmethod?: string;\n\theaders?: HeadersInit;\n\twithCredentials?: boolean;\n}\n\n/** 将 Element Plus 上传附加数据写入 FormData。 */\nconst appendUploadData = (formData: FormData, params: UploadData): void => {\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length === 2 && value[0] instanceof Blob && typeof value[1] === \"string\") {\n\t\t\t\tformData.append(key, value[0], value[1]);\n\t\t\t} else {\n\t\t\t\tvalue.forEach((item) => formData.append(key, item));\n\t\t\t}\n\t\t} else {\n\t\t\tformData.append(key, value);\n\t\t}\n\t}\n};\n\nconst FaMimeTypeNames: Record<string, keyof typeof FaMimeType> = {};\n\nfor (const [kName, vAccept] of Object.entries(FaMimeType)) {\n\tvAccept.split(\",\").forEach((tItem) => {\n\t\tFaMimeTypeNames[tItem.trim()] = kName as keyof typeof FaMimeType;\n\t});\n}\n\n/**\n * 上传工具类\n */\nexport const uploadUtil = {\n\t/**\n\t * 识别文件类型\n\t */\n\tdetectFileType(accept: string): string {\n\t\tconst detectTypes = new Set<string>();\n\t\taccept.split(\",\").forEach((mimeType) => {\n\t\t\tconst normalizedMimeType = mimeType.trim();\n\t\t\tif (normalizedMimeType) detectTypes.add(FaMimeTypeNames[normalizedMimeType] ?? normalizedMimeType);\n\t\t});\n\t\treturn Array.from(detectTypes).join(\",\");\n\t},\n\t/** 判断文件是否符合 HTML accept 规则。 */\n\tmatchesAccept(file: File, accept?: string): boolean {\n\t\tif (!accept?.trim()) return true;\n\t\tconst fileName = file.name.toLowerCase();\n\t\tconst fileType = file.type.toLowerCase();\n\t\treturn accept.split(\",\").some((item) => {\n\t\t\tconst rule = item.trim().toLowerCase();\n\t\t\tif (!rule) return false;\n\t\t\tif (rule.startsWith(\".\")) return fileName.endsWith(rule);\n\t\t\tif (rule.endsWith(\"/*\")) return fileType.startsWith(rule.slice(0, -1));\n\t\t\treturn fileType === rule;\n\t\t});\n\t},\n\t/**\n\t * 使用 multipart/form-data 上传文件。\n\t * @param url - 地址\n\t * @param file - 文件\n\t * @param fileName - 文件名称\n\t * @param params - 附加表单字段\n\t * @param request - 请求头、方法与凭据选项\n\t * @returns 响应正文文本\n\t * @remarks 地址为空、网络失败或 HTTP 状态失败时，返回的 Promise 被拒绝。\n\t */\n\tasync uploadFile(url: string, file: File, fileName: string, params?: UploadData, request?: UploadRequestConfig): Promise<string> {\n\t\tif (!url) {\n\t\t\tconsole.error(\"[Fast:uploadUtil]\", \"文件上传地址为空。\");\n\t\t\tElMessage.error(\"文件上传地址为空！\");\n\t\t\tthrow new Error(\"文件上传地址为空！\");\n\t\t}\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"fileName\", fileName);\n\t\tif (params) appendUploadData(formData, params);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: request?.headers,\n\t\t\t\tmethod: request?.method ?? \"POST\",\n\t\t\t\tcredentials: request?.withCredentials ? \"include\" : \"same-origin\",\n\t\t\t\tbody: formData,\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\"[Fast:uploadUtil]\", `文件上传失败，HTTP 状态码：${response.status.toString()}。`);\n\t\t\t\tElMessage.error(\"文件上传失败！\");\n\t\t\t\tthrow new Error(\"文件上传失败！\");\n\t\t\t}\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Fast:uploadUtil]\", \"文件上传失败。\", error);\n\t\t\tElMessage.error(\"文件上传失败！\");\n\t\t\tthrow error instanceof Error ? error : new Error(\"文件上传失败！\");\n\t\t}\n\t},\n\t/**\n\t * 通过指定接口上传文件。\n\t * @param api - 接收表单数据并返回上传结果的接口\n\t * @param file - 文件\n\t * @param fileName - 文件名称\n\t * @param params - 附加表单字段\n\t * @returns 接口返回的上传结果\n\t * @remarks 接口未提供或调用失败时，返回的 Promise 被拒绝。\n\t */\n\tasync uploadFileByApi(\n\t\tapi: ((formData: FormData) => Promise<string>) | null | undefined,\n\t\tfile: File,\n\t\tfileName: string,\n\t\tparams?: UploadData\n\t): Promise<string> {\n\t\tif (!api) {\n\t\t\tconsole.error(\"[Fast:uploadUtil]\", \"文件上传接口为空。\");\n\t\t\tElMessage.error(\"文件上传接口为空！\");\n\t\t\tthrow new Error(\"文件上传接口为空！\");\n\t\t}\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"fileName\", fileName);\n\t\tif (params) appendUploadData(formData, params);\n\t\ttry {\n\t\t\treturn await api(formData);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Fast:uploadUtil]\", \"文件上传失败。\", error);\n\t\t\tElMessage.error(\"文件上传失败！\");\n\t\t\tthrow error instanceof Error ? error : new Error(\"文件上传失败！\");\n\t\t}\n\t},\n};\n"],"mappings":"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"}