소스 검색

♻️ refactor(upload): 重构文件上传逻辑

- 重命名 uploadFromChoose 为 uploadFromSelect,统一命名规范
- 修改文件上传参数结构,支持更灵活的配置选项
- UploadResult 接口新增 fileId 字段,用于标识上传文件

✨ feat(avatar): 优化头像上传功能

- 调整用户头像数据结构,使用 avatarFileId 替代完整 URL 存储
- 修复头像更新成功提示的缩进问题,提高代码可读性

⚡️ perf(minio): 提升文件上传完成处理

- 完善分段上传完成逻辑,正确返回 fileId
- 优化上传结果数据处理,确保前端能获取完整的文件标识信息
yourname 4 달 전
부모
커밋
2b0fb38710
3개의 변경된 파일29개의 추가작업 그리고 20개의 파일을 삭제
  1. 6 3
      mini/src/components/ui/avatar-upload.tsx
  2. 7 10
      mini/src/pages/profile/index.tsx
  3. 16 7
      mini/src/utils/minio.ts

+ 6 - 3
mini/src/components/ui/avatar-upload.tsx

@@ -3,7 +3,7 @@ import { View, Text, Image } from '@tarojs/components'
 import Taro from '@tarojs/taro'
 import { cn } from '@/utils/cn'
 import { Button } from '@/components/ui/button'
-import { uploadFromChoose, type UploadResult } from '@/utils/minio'
+import { uploadFromSelect, type UploadResult } from '@/utils/minio'
 
 interface AvatarUploadProps {
   currentAvatar?: string
@@ -30,9 +30,12 @@ export function AvatarUpload({
       setUploading(true)
       setProgress(0)
 
-      const result = await uploadFromChoose(
-        ['album', 'camera'],
+      const result = await uploadFromSelect(
         'avatars',
+        {
+          sourceType: ['album', 'camera'],
+          count: 1
+        },
         {
           onProgress: (event) => {
             setProgress(event.progress)

+ 7 - 10
mini/src/pages/profile/index.tsx

@@ -58,19 +58,16 @@ const ProfilePage: React.FC = () => {
       if (userProfile) {
         const updatedUser = {
           ...userProfile,
-          avatarFile: {
-            ...userProfile.avatarFile,
-            fullUrl: result.fileUrl
-          }
+          avatarFileId: result.fileId
         }
         updateUser(updatedUser)
       }
-      
-      Taro.hideLoading()
-      Taro.showToast({
-        title: '头像更新成功',
-        icon: 'success'
-      })
+        
+        Taro.hideLoading()
+        Taro.showToast({
+          title: '头像更新成功',
+          icon: 'success'
+        })
     } catch (error) {
       console.error('更新头像失败:', error)
       Taro.hideLoading()

+ 16 - 7
mini/src/utils/minio.ts

@@ -38,6 +38,7 @@ export interface UploadResult {
   fileUrl: string;
   fileKey: string;
   bucketName: string;
+  fileId: number;
 }
 
 interface UploadPart {
@@ -143,7 +144,8 @@ export class MinIOXHRMultipartUploader {
       return {
         fileUrl: `${policy.host}/${key}`,
         fileKey: key,
-        bucketName: policy.bucket
+        bucketName: policy.bucket,
+        fileId: result.file.id
       };
     } catch (error) {
       callbacks?.onError?.(error instanceof Error ? error : new Error(String(error)));
@@ -210,7 +212,7 @@ export class MinIOXHRMultipartUploader {
     policy: MinioMultipartUploadPolicy,
     key: string,
     uploadedParts: UploadPart[]
-  ): Promise<void> {
+  ): Promise<{ fileId: number }> {
     const response = await fileClient["multipart-complete"].$post({
       json: {
         bucket: policy.bucket,
@@ -223,6 +225,8 @@ export class MinIOXHRMultipartUploader {
     if (!response.ok) {
       throw new Error(`完成分段上传失败: ${response.status} ${response.statusText}`);
     }
+    
+    return response.json();
   }
 }
 
@@ -283,7 +287,8 @@ export class MinIOXHRUploader {
           resolve({
             fileUrl: `${policy.uploadPolicy.host}/${key}`,
             fileKey: key,
-            bucketName: policy.uploadPolicy.bucket
+            bucketName: policy.uploadPolicy.bucket,
+            fileId: result.file.id
           });
         } else {
           const error = new Error(`上传失败: ${xhr.status} ${xhr.statusText}`);
@@ -412,7 +417,7 @@ export class TaroMinIOMultipartUploader {
     
     // 完成上传
     try {
-      await this.completeMultipartUpload(policy, key, uploadedParts);
+      const result = await this.completeMultipartUpload(policy, key, uploadedParts);
       
       callbacks?.onProgress?.({
         stage: 'complete',
@@ -425,7 +430,8 @@ export class TaroMinIOMultipartUploader {
       return {
         fileUrl: `${policy.host}/${key}`,
         fileKey: key,
-        bucketName: policy.bucket
+        bucketName: policy.bucket,
+        fileId: result.fileId
       };
     } catch (error) {
       callbacks?.onError?.(error instanceof Error ? error : new Error(String(error)));
@@ -489,7 +495,7 @@ export class TaroMinIOMultipartUploader {
     policy: MinioMultipartUploadPolicy,
     key: string,
     uploadedParts: UploadPart[]
-  ): Promise<void> {
+  ): Promise<{ fileId: number }> {
     const response = await fileClient["multipart-complete"].$post({
       json: {
         bucket: policy.bucket,
@@ -502,6 +508,8 @@ export class TaroMinIOMultipartUploader {
     if (!response.ok) {
       throw new Error(`完成分段上传失败: ${response.status} ${response.statusText}`);
     }
+    
+    return await response.json();
   }
 }
 
@@ -573,7 +581,8 @@ export class TaroMinIOUploader {
                 resolve({
                   fileUrl: `${policy.uploadPolicy.host}/${key}`,
                   fileKey: key,
-                  bucketName: policy.uploadPolicy.bucket
+                  bucketName: policy.uploadPolicy.bucket,
+                  fileId: result.file.id
                 });
               } else {
                 reject(new Error(`上传失败: ${res.statusCode}`));