Przeglądaj źródła

🐛 fix(minio): 修复文件上传相关问题

- 修改readFileSlice方法返回类型,支持string或ArrayBuffer
- 优化readFileSync调用参数格式,解决参数传递问题
- 重构上传逻辑,使用try-catch替代回调方式处理文件读取和上传
- 修复fileId类型错误,从字符串改为数字类型

♻️ refactor(minio): 优化上传代码结构

- 移除uploadFromChoose导出,清理未使用接口
- 统一错误处理方式,提高代码可读性和可维护性
- 优化FormData构建逻辑,确保参数正确传递
yourname 4 miesięcy temu
rodzic
commit
271e262e33

+ 48 - 49
mini/src/utils/minio.ts

@@ -438,7 +438,7 @@ export class TaroMinIOMultipartUploader {
   }
   
   // 读取文件片段
-  private static async readFileSlice(filePath: string, start: number, end: number): Promise<ArrayBuffer> {
+  private static async readFileSlice(filePath: string, start: number, end: number): Promise<string | ArrayBuffer> {
     return new Promise((resolve, reject) => {
       try {
         const fs = Taro?.getFileSystemManager?.();
@@ -447,10 +447,7 @@ export class TaroMinIOMultipartUploader {
           return;
         }
         
-        const fileData = fs.readFileSync(filePath, undefined, {
-          position: start,
-          length: end - start
-        });
+        const fileData = fs.readFileSync(filePath, undefined, start, end - start );
         resolve(fileData);
       } catch (error) {
         reject(error);
@@ -549,50 +546,53 @@ export class TaroMinIOUploader {
       
       formData['key'] = key;
       
-      Taro?.getFileSystemManager?.()?.readFile({
-        filePath,
-        success: (fileData) => {
-          const formDataObj = new FormData();
-          Object.entries(formData).forEach(([k, value]) => {
-            formDataObj.append(k, value);
-          });
-          formDataObj.append('file', new Blob([fileData.data]));
-          
-          Taro?.request?.({
-            url: policy.uploadPolicy.host,
-            method: 'POST',
-            data: formDataObj,
-            header: {
-              'Content-Type': 'multipart/form-data'
-            },
-            success: (res: any) => {
-              if (res.statusCode >= 200 && res.statusCode < 300) {
-                callbacks?.onProgress?.({
-                  stage: 'complete',
-                  message: '文件上传完成',
-                  progress: 100,
-                  timestamp: Date.now()
-                });
-                callbacks?.onComplete?.();
-                resolve({
-                  fileUrl: `${policy.uploadPolicy.host}/${key}`,
-                  fileKey: key,
-                  bucketName: policy.uploadPolicy.bucket,
-                  fileId: result.file.id
-                });
-              } else {
-                reject(new Error(`上传失败: ${res.statusCode}`));
-              }
-            },
-            fail: (error: any) => {
-              reject(new Error(`上传失败: ${error.errMsg}`));
-            }
-          });
-        },
-        fail: (error: any) => {
-          reject(new Error(`读取文件失败: ${error.errMsg}`));
+      try {
+        const fileSystemManager = Taro?.getFileSystemManager?.();
+        if (!fileSystemManager) {
+          throw new Error('小程序环境不可用');
         }
-      }) || reject(new Error('小程序环境不可用'));
+
+        const fileData = fileSystemManager.readFileSync(filePath, 'binary');
+        
+        const formDataObj = new FormData();
+        Object.entries(formData).forEach(([k, value]) => {
+          formDataObj.append(k, value);
+        });
+        formDataObj.append('file', new Blob([fileData]));
+
+        Taro?.request?.({
+          url: policy.uploadPolicy.host,
+          method: 'POST',
+          data: formDataObj,
+          header: {
+            'Content-Type': 'multipart/form-data'
+          },
+          success: (res) => {
+            if (res.statusCode >= 200 && res.statusCode < 300) {
+              callbacks?.onProgress?.({
+                stage: 'complete',
+                message: '文件上传完成',
+                progress: 100,
+                timestamp: Date.now()
+              });
+              callbacks?.onComplete?.();
+              resolve({
+                fileUrl: `${policy.uploadPolicy.host}/${key}`,
+                fileKey: key,
+                bucketName: policy.uploadPolicy.bucket,
+                fileId: policy.file.id
+              });
+            } else {
+              reject(new Error(`上传失败: ${res.statusCode}`));
+            }
+          },
+          fail: (error: any) => {
+            reject(new Error(`上传失败: ${error.errMsg}`));
+          }
+        });
+      } catch (error: any) {
+        reject(new Error(`读取文件失败: ${error.message || error.errMsg}`));
+      }
     });
   }
 }
@@ -869,6 +869,5 @@ export default {
   getMultipartUploadPolicy,
   uploadMinIOWithPolicy,
   uploadMinIOWithTaroFile,
-  uploadFromChoose,
   uploadFromSelect
 };

+ 2 - 2
src/server/api/files/multipart-complete/post.ts

@@ -41,9 +41,9 @@ const CompleteMultipartUploadDto = z.object({
 
 // 完成分片上传响应Schema
 const CompleteMultipartUploadResponse = z.object({
-  fileId: z.string().openapi({
+  fileId: z.number().openapi({
     description: '文件ID',
-    example: 'file_123456'
+    example: 123456
   }),
   url: z.string().openapi({
     description: '文件访问URL',