From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/components/UploadFile/src/useUpload.ts |  102 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/src/components/UploadFile/src/useUpload.ts b/src/components/UploadFile/src/useUpload.ts
new file mode 100644
index 0000000..dddd159
--- /dev/null
+++ b/src/components/UploadFile/src/useUpload.ts
@@ -0,0 +1,102 @@
+import * as FileApi from '@/api/infra/file'
+import {
+  UploadRawFile,
+  UploadRequestOptions,
+  UploadProgressEvent
+} from 'element-plus/es/components/upload/src/upload'
+import axios, { AxiosProgressEvent } from 'axios'
+
+/**
+ * 鑾峰緱涓婁紶 URL
+ */
+export const getUploadUrl = (): string => {
+  return import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/infra/file/upload'
+}
+
+export const useUpload = (directory?: string) => {
+  // 鍚庣涓婁紶鍦板潃
+  const uploadUrl = getUploadUrl()
+  // 鏄惁浣跨敤鍓嶇鐩磋繛涓婁紶
+  const isClientUpload = UPLOAD_TYPE.CLIENT === import.meta.env.VITE_UPLOAD_TYPE
+  // 閲嶅啓ElUpload涓婁紶鏂规硶
+  const httpRequest = async (options: UploadRequestOptions) => {
+    // 鏂囦欢涓婁紶杩涘害鐩戝惉
+    const uploadProgressHandler = (evt: AxiosProgressEvent) => {
+      const upEvt: UploadProgressEvent = Object.assign(evt.event)
+      upEvt.percent = evt.progress ? evt.progress * 100 : 0
+      options.onProgress(upEvt) // 瑙﹀彂 el-upload 鐨� on-progress
+    }
+
+    // 妯″紡涓�锛氬墠绔笂浼�
+    if (isClientUpload) {
+      // 1.1 鐢熸垚鏂囦欢鍚嶇О
+      const fileName = options.file.name || options.filename
+      // 1.2 鑾峰彇鏂囦欢棰勭鍚嶅湴鍧�
+      const presignedInfo = await FileApi.getFilePresignedUrl(fileName, directory)
+      // 1.3 涓婁紶鏂囦欢锛堜笉鑳戒娇鐢� ElUpload 鐨� ajaxUpload 鏂规硶鐨勫師鍥狅細鍏朵娇鐢ㄧ殑鏄� FormData 涓婁紶锛孧inio 涓嶆敮鎸侊級
+      return axios
+        .put(presignedInfo.uploadUrl, options.file, {
+          headers: {
+            'Content-Type': options.file.type || 'application/octet-stream'
+          },
+          onUploadProgress: uploadProgressHandler
+        })
+        .then(() => {
+          // 1.4. 璁板綍鏂囦欢淇℃伅鍒板悗绔紙寮傛锛�
+          createFile(presignedInfo, options.file, fileName)
+          // 閫氱煡鎴愬姛锛屾暟鎹牸寮忎繚鎸佷笌鍚庣涓婁紶鐨勮繑鍥炵粨鏋滀竴鑷�
+          return { data: presignedInfo.url }
+        })
+    } else {
+      // 妯″紡浜岋細鍚庣涓婁紶
+      // 閲嶅啓 el-upload httpRequest 鏂囦欢涓婁紶鎴愬姛浼氳蛋鎴愬姛鐨勯挬瀛愶紝澶辫触璧板け璐ョ殑閽╁瓙
+      return new Promise((resolve, reject) => {
+        FileApi.updateFile({ file: options.file, directory }, uploadProgressHandler)
+          .then((res) => {
+            if (res.code === 0) {
+              resolve(res)
+            } else {
+              reject(res)
+            }
+          })
+          .catch((res) => {
+            reject(res)
+          })
+      })
+    }
+  }
+
+  return {
+    uploadUrl,
+    httpRequest
+  }
+}
+
+/**
+ * 鍒涘缓鏂囦欢淇℃伅
+ * @param vo 鏂囦欢棰勭鍚嶄俊鎭�
+ * @param file 鏂囦欢
+ * @param fileName
+ */
+function createFile(vo: FileApi.FilePresignedUrlRespVO, file: UploadRawFile, fileName: string) {
+  const fileVo = {
+    configId: vo.configId,
+    url: vo.url,
+    path: vo.path,
+    name: fileName,
+    type: file.type || 'application/octet-stream',
+    size: file.size
+  }
+  FileApi.createFile(fileVo)
+  return fileVo
+}
+
+/**
+ * 涓婁紶绫诲瀷
+ */
+enum UPLOAD_TYPE {
+  // 瀹㈡埛绔洿鎺ヤ笂浼狅紙鍙敮鎸丼3鏈嶅姟锛�
+  CLIENT = 'client',
+  // 瀹㈡埛绔彂閫佸埌鍚庣涓婁紶
+  SERVER = 'server'
+}

--
Gitblit v1.8.0