Browse Source

🐛 fix(file): 修复MinIO分片上传及文件大小获取问题

- 修复客户端上传策略请求参数名错误,将key改为path
- 修复分片上传完成时parts参数格式不匹配问题
- 添加文件大小获取功能,完成上传后返回文件大小信息
- 统一客户端和服务端分片上传parts参数格式
yourname 8 months ago
parent
commit
4fc0514804

+ 2 - 2
src/client/utils/minio.ts

@@ -201,7 +201,7 @@ export class MinIOXHRMultipartUploader {
             bucket: policy.bucket,
             key,
             uploadId: policy.uploadId,
-            parts: uploadedParts
+            parts: uploadedParts.map(part => ({ partNumber: part.PartNumber, etag: part.ETag }))
         }
     });
     
@@ -316,7 +316,7 @@ export class MinIOXHRUploader {
 
 export async function getUploadPolicy(key: string): Promise<MinioUploadPolicy> {
   const policyResponse = await fileClient["upload-policy"].$post({
-    json: { key }
+    json: { path: key }
   });
   if (!policyResponse.ok) {
     throw new Error('获取上传策略失败');

+ 2 - 2
src/server/modules/files/file.service.ts

@@ -143,7 +143,7 @@ export class FileService extends GenericCrudService<File> {
     uploadId: string;
     bucket: string;
     key: string;
-    parts: Array<{ partNumber: number; etag: string }>;
+    parts: Array<{ PartNumber: number; ETag: string }>;
   }) {
     try {
       // 完成MinIO分片上传
@@ -151,7 +151,7 @@ export class FileService extends GenericCrudService<File> {
         data.bucket,
         data.key,
         data.uploadId,
-        data.parts
+        data.parts.map(part => ({ PartNumber: part.PartNumber, ETag: part.ETag }))
       );
       
       // 查找文件记录并更新

+ 6 - 2
src/server/modules/files/minio.service.ts

@@ -143,15 +143,19 @@ export class MinioService {
     objectName: string,
     uploadId: string,
     parts: { ETag: string; PartNumber: number }[]
-  ) {
+  ): Promise<{ size: number }> {
     try {
       await this.client.completeMultipartUpload(
         bucketName,
         objectName,
         uploadId,
         parts.map(p => ({ part: p.PartNumber, etag: p.ETag }))
-      )
+      );
       logger.db(`Completed multipart upload for ${objectName} with ID: ${uploadId}`);
+      
+      // 获取对象信息以获取文件大小
+      const stat = await this.client.statObject(bucketName, objectName);
+      return { size: stat.size };
     } catch (error) {
       logger.error(`Failed to complete multipart upload for ${objectName}:`, error);
       throw error;