Procházet zdrojové kódy

✨ feat(minio): 增强文件上传策略功能

- 为getUploadPolicy函数添加fileType和fileSize参数,支持传递文件类型和大小
- 为getMultipartUploadPolicy函数添加fileType参数,支持传递文件类型
- 在multipart-policy接口中添加type字段,用于接收文件类型信息
- 优化分片数量计算逻辑,通过totalSize和partSize自动计算partCount

🐛 fix(multipart): 修复分片数量计算问题

- 修复分片上传策略中partCount参数可能未正确传递的问题
- 确保通过totalSize和partSize准确计算分片数量
yourname před 8 měsíci
rodič
revize
19cfa0f17d

+ 13 - 6
src/client/utils/minio.ts

@@ -314,11 +314,13 @@ export class MinIOXHRUploader {
     }
 } 
 
-export async function getUploadPolicy(key: string, fileName: string): Promise<MinioUploadPolicy> {
+export async function getUploadPolicy(key: string, fileName: string, fileType?: string, fileSize?: number): Promise<MinioUploadPolicy> {
   const policyResponse = await fileClient["upload-policy"].$post({
     json: {
       path: key,
-      name: fileName
+      name: fileName,
+      type: fileType,
+      size: fileSize
     }
   });
   if (!policyResponse.ok) {
@@ -327,9 +329,14 @@ export async function getUploadPolicy(key: string, fileName: string): Promise<Mi
   return policyResponse.json();
 }
 
-export async function getMultipartUploadPolicy(totalSize: number,fileKey: string) {
+export async function getMultipartUploadPolicy(totalSize: number, fileKey: string, fileType?: string) {
   const policyResponse = await fileClient["multipart-policy"].$post({
-    json: { totalSize, partSize: PART_SIZE, fileKey}
+    json: {
+      totalSize,
+      partSize: PART_SIZE,
+      fileKey,
+      type: fileType
+    }
   });
   if (!policyResponse.ok) {
     throw new Error('获取分段上传策略失败');
@@ -352,7 +359,7 @@ export async function uploadMinIOWithPolicy(
   
   
   if( file.size > PART_SIZE ){
-    const policy = await getMultipartUploadPolicy(file.size, `${uploadPath}${fileKey}`)
+    const policy = await getMultipartUploadPolicy(file.size, `${uploadPath}${fileKey}`, file instanceof File ? file.type : undefined)
     return MinIOXHRMultipartUploader.upload(
       policy,
       file,
@@ -363,7 +370,7 @@ export async function uploadMinIOWithPolicy(
     if (!(file instanceof File)) {
       throw new Error('不支持的文件类型,无法获取文件名');
     }
-    const policy = await getUploadPolicy(`${uploadPath}${fileKey}`, file.name);
+    const policy = await getUploadPolicy(`${uploadPath}${fileKey}`, file.name, file.type, file.size);
     return MinIOXHRUploader.upload(policy, file, policy.uploadPolicy.key, callbacks);
   }
 }

+ 7 - 1
src/server/api/files/multipart-policy/post.ts

@@ -19,6 +19,10 @@ const CreateMultipartUploadPolicyDto = z.object({
   partSize: z.coerce.number().int().positive().openapi({
     description: '分片大小(字节)',
     example: 5242880
+  }),
+  type: z.string().max(50).nullable().optional().openapi({
+    description: '文件类型',
+    example: 'application/pdf'
   })
 });
 
@@ -85,7 +89,9 @@ const fileService = new FileService(AppDataSource);
 const app = new OpenAPIHono<AuthContext>().openapi(createMultipartUploadPolicyRoute, async (c) => {
   try {
     const data = await c.req.json();
-    const result = await fileService.createMultipartUploadPolicy(data, data.partCount || 1);
+    // 计算分片数量
+    const partCount = Math.ceil(data.totalSize / data.partSize);
+    const result = await fileService.createMultipartUploadPolicy(data, partCount);
     
     return c.json({
       uploadId: result.uploadId,