LAPTOP-1LHD2FP6\joeny vor 9 Monaten
Ursprung
Commit
47c1e93226
2 geänderte Dateien mit 94 neuen und 14 gelöschten Zeilen
  1. 93 13
      backend/Service/MinioService.py
  2. 1 1
      restart.sh

+ 93 - 13
backend/Service/MinioService.py

@@ -3,7 +3,8 @@ import os
 from datetime import timedelta, datetime
 from io import BytesIO
 import logging
-
+from django.core.exceptions import ObjectDoesNotExist
+from minio.error import S3Error
 
 
 
@@ -336,6 +337,50 @@ class MinioService:
     #     except Exception as e:
     #         return fail(str(e))
 
+    # def post(request):
+    #     """上传文件"""
+    #     logger.info("Starting file upload process")
+    #     try:
+    #         uploaded_file = request.FILES['file']
+    #         bucket_id = request.POST.get('bucket_id')
+    #         user_id = request.POST.get('user_id')
+    #         file_path = request.POST.get('file_path', '')
+    #         doc_type_id = request.POST.get('doc_type_id', 0)
+    #
+    #         if not uploaded_file:
+    #             return fail('没有需要上传的文件')
+    #         if not bucket_id:
+    #             return fail('bucket_id为空')
+    #
+    #         object_name = f"{file_path.strip('/')}/{uploaded_file.name}".lstrip('/')
+    #         logger.debug(f"Constructed object name: {object_name}")
+    #
+    #         count = DocumentKbm.objects.filter(name=object_name, kb_id=bucket_id).exclude(status=4).count()
+    #         if count > 0:
+    #             return fail("已有重复文件,请删除后重试")
+    #
+    #         file_content = uploaded_file.read()
+    #         knowledgebase = Knowledgebase.objects.get(id=bucket_id)
+    #         bucket_name = knowledgebase.location
+    #
+    #         logger.info(f"Uploading file to MinIO: {object_name} in bucket {bucket_name}")
+    #         minio_client.put_object(
+    #             bucket_name,
+    #             object_name,
+    #             ContentFile(file_content),
+    #             length=len(file_content),
+    #             content_type=uploaded_file.content_type
+    #         )
+    #
+    #         logger.info("MinIO upload successful, calling saveDocumentKbm")
+    #         MinioService.saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id)
+    #
+    #         logger.info("File upload process completed successfully")
+    #         return success("保存成功")
+    #     except Exception as e:
+    #         logger.error(f"Error in file upload process: {str(e)}", exc_info=True)
+    #         return fail(str(e))
+
     def post(request):
         """上传文件"""
         logger.info("Starting file upload process")
@@ -359,23 +404,39 @@ class MinioService:
                 return fail("已有重复文件,请删除后重试")
 
             file_content = uploaded_file.read()
-            knowledgebase = Knowledgebase.objects.get(id=bucket_id)
+            try:
+                knowledgebase = Knowledgebase.objects.get(id=bucket_id)
+            except ObjectDoesNotExist:
+                return fail(f"知识库 ID {bucket_id} 不存在")
+
             bucket_name = knowledgebase.location
 
             logger.info(f"Uploading file to MinIO: {object_name} in bucket {bucket_name}")
-            minio_client.put_object(
-                bucket_name,
-                object_name,
-                ContentFile(file_content),
-                length=len(file_content),
-                content_type=uploaded_file.content_type
-            )
+            try:
+                minio_client.put_object(
+                    bucket_name,
+                    object_name,
+                    ContentFile(file_content),
+                    length=len(file_content),
+                    content_type=uploaded_file.content_type
+                )
+            except S3Error as s3_err:
+                logger.error(f"MinIO upload failed: {str(s3_err)}")
+                return fail(f"文件上传到 MinIO 失败: {str(s3_err)}")
 
             logger.info("MinIO upload successful, calling saveDocumentKbm")
-            MinioService.saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id)
+            try:
+                MinioService.saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id)
+            except Exception as save_err:
+                logger.error(f"Error in saveDocumentKbm: {str(save_err)}", exc_info=True)
+                # 考虑在这里删除已上传到 MinIO 的文件
+                return fail(f"保存文档信息失败: {str(save_err)}")
 
             logger.info("File upload process completed successfully")
             return success("保存成功")
+        except KeyError as key_err:
+            logger.error(f"Missing required field: {str(key_err)}")
+            return fail(f"缺少必要的字段: {str(key_err)}")
         except Exception as e:
             logger.error(f"Error in file upload process: {str(e)}", exc_info=True)
             return fail(str(e))
@@ -467,6 +528,8 @@ class MinioService:
     #
     #         return fail(str(e))
 
+    @staticmethod
+    @transaction.atomic
     def saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id):
         logger.info(f"Starting saveDocumentKbm for file: {object_name}")
         try:
@@ -498,7 +561,14 @@ class MinioService:
             )
             logger.info(f"Created DocumentKbm with id: {documentKbm.id}")
 
-            admin = Admin.objects.get(id=user_id)
+            try:
+                admin = Admin.objects.get(id=user_id)
+            except Admin.DoesNotExist:
+                logger.error(f"Admin with id {user_id} does not exist")
+                raise ValueError(f"Admin with id {user_id} does not exist")
+
+            logger.debug(
+                f"Searching for File with: role_id={admin.role_id}, created_by={user_id}, name={knowledgebase.name}")
             file = File.objects.filter(
                 role_id=admin.role_id,
                 created_by=user_id,
@@ -508,8 +578,16 @@ class MinioService:
             ).exclude(status=4).first()
 
             if not file:
-                logger.warning(f"No matching File found for knowledgebase: {knowledgebase.name}")
-                raise ValueError("No matching File found")
+                logger.warning(f"No matching File found for knowledgebase: {knowledgebase.name}. Creating a new one.")
+                file = File.objects.create(
+                    role_id=admin.role_id,
+                    name=knowledgebase.name,
+                    source_type='knowledgebase',
+                    created_by=user_id,
+                    type='folder',
+                    status=5
+                )
+                logger.info(f"Created new File record for knowledgebase: {file.id}")
 
             fileDB = File.objects.create(
                 role_id=admin.role_id,
@@ -539,6 +617,8 @@ class MinioService:
             logger.error(f"Error in saveDocumentKbm: {str(e)}", exc_info=True)
             raise
 
+        logger.info("saveDocumentKbm completed successfully")
+
     # 根据名称获取地址
     @staticmethod
     def nameGetUrl(request):

+ 1 - 1
restart.sh

@@ -22,7 +22,7 @@ else
 fi
 
 # 安装依赖
-pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
+# pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
 
 # 启动新的进程并保存 PID
 #nohup python manage.py runserver 0.0.0.0:8084 > nohup.out 2>&1 &  #49服务用这个