Просмотр исходного кода

🐛 fix(files): 修复文件删除时MinIO文件不存在导致的错误

- 新增objectExists方法检查MinIO中文件是否存在
- 在删除文件前先验证MinIO中文件是否存在
- 当MinIO中文件不存在时记录错误日志但仍继续删除数据库记录

✨ feat(minio): 添加文件存在性检查功能

- 实现objectExists方法用于验证MinIO中的对象是否存在
- 优化错误处理,区分文件不存在和其他类型错误
yourname 8 месяцев назад
Родитель
Сommit
d6995c5016

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

@@ -59,8 +59,15 @@ export class FileService extends GenericCrudService<File> {
         throw new Error('文件不存在');
       }
       
-      // 从MinIO删除文件
-      await this.minioService.deleteObject(this.minioService.bucketName, file.path);
+      // 验证文件是否存在于MinIO
+      const fileExists = await this.minioService.objectExists(this.minioService.bucketName, file.path);
+      if (!fileExists) {
+        logger.error(`File not found in MinIO: ${this.minioService.bucketName}/${file.path}`);
+        // 仍然继续删除数据库记录,但记录警告日志
+      } else {
+        // 从MinIO删除文件
+        await this.minioService.deleteObject(this.minioService.bucketName, file.path);
+      }
       
       // 从数据库删除记录
       await this.delete(id);

+ 14 - 0
src/server/modules/files/minio.service.ts

@@ -177,6 +177,20 @@ export class MinioService {
     }
   }
 
+  // 检查文件是否存在
+  async objectExists(bucketName: string, objectName: string): Promise<boolean> {
+    try {
+      await this.client.statObject(bucketName, objectName);
+      return true;
+    } catch (error) {
+      if ((error as Error).message.includes('not found')) {
+        return false;
+      }
+      logger.error(`Error checking existence of object ${bucketName}/${objectName}:`, error);
+      throw error;
+    }
+  }
+
   // 删除文件
   async deleteObject(bucketName: string, objectName: string) {
     try {