|
@@ -3,7 +3,8 @@ import os
|
|
from datetime import timedelta, datetime
|
|
from datetime import timedelta, datetime
|
|
from io import BytesIO
|
|
from io import BytesIO
|
|
import logging
|
|
import logging
|
|
-
|
|
|
|
|
|
+from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
+from minio.error import S3Error
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -336,6 +337,50 @@ class MinioService:
|
|
# except Exception as e:
|
|
# except Exception as e:
|
|
# return fail(str(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):
|
|
def post(request):
|
|
"""上传文件"""
|
|
"""上传文件"""
|
|
logger.info("Starting file upload process")
|
|
logger.info("Starting file upload process")
|
|
@@ -359,23 +404,39 @@ class MinioService:
|
|
return fail("已有重复文件,请删除后重试")
|
|
return fail("已有重复文件,请删除后重试")
|
|
|
|
|
|
file_content = uploaded_file.read()
|
|
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
|
|
bucket_name = knowledgebase.location
|
|
|
|
|
|
logger.info(f"Uploading file to MinIO: {object_name} in bucket {bucket_name}")
|
|
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")
|
|
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")
|
|
logger.info("File upload process completed successfully")
|
|
return success("保存成功")
|
|
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:
|
|
except Exception as e:
|
|
logger.error(f"Error in file upload process: {str(e)}", exc_info=True)
|
|
logger.error(f"Error in file upload process: {str(e)}", exc_info=True)
|
|
return fail(str(e))
|
|
return fail(str(e))
|
|
@@ -467,6 +528,8 @@ class MinioService:
|
|
#
|
|
#
|
|
# return fail(str(e))
|
|
# return fail(str(e))
|
|
|
|
|
|
|
|
+ @staticmethod
|
|
|
|
+ @transaction.atomic
|
|
def saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id):
|
|
def saveDocumentKbm(knowledgebase, uploaded_file, user_id, object_name, doc_type_id):
|
|
logger.info(f"Starting saveDocumentKbm for file: {object_name}")
|
|
logger.info(f"Starting saveDocumentKbm for file: {object_name}")
|
|
try:
|
|
try:
|
|
@@ -498,7 +561,14 @@ class MinioService:
|
|
)
|
|
)
|
|
logger.info(f"Created DocumentKbm with id: {documentKbm.id}")
|
|
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(
|
|
file = File.objects.filter(
|
|
role_id=admin.role_id,
|
|
role_id=admin.role_id,
|
|
created_by=user_id,
|
|
created_by=user_id,
|
|
@@ -508,8 +578,16 @@ class MinioService:
|
|
).exclude(status=4).first()
|
|
).exclude(status=4).first()
|
|
|
|
|
|
if not file:
|
|
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(
|
|
fileDB = File.objects.create(
|
|
role_id=admin.role_id,
|
|
role_id=admin.role_id,
|
|
@@ -539,6 +617,8 @@ class MinioService:
|
|
logger.error(f"Error in saveDocumentKbm: {str(e)}", exc_info=True)
|
|
logger.error(f"Error in saveDocumentKbm: {str(e)}", exc_info=True)
|
|
raise
|
|
raise
|
|
|
|
|
|
|
|
+ logger.info("saveDocumentKbm completed successfully")
|
|
|
|
+
|
|
# 根据名称获取地址
|
|
# 根据名称获取地址
|
|
@staticmethod
|
|
@staticmethod
|
|
def nameGetUrl(request):
|
|
def nameGetUrl(request):
|