@@ -23,8 +23,69 @@ class AttachmentService:
2323 """附件处理服务类"""
2424
2525 def __init__ (self ):
26- self .upload_dir = Path (settings .UPLOAD_DIR ) / "email_attachments"
27- self .upload_dir .mkdir (parents = True , exist_ok = True )
26+ """初始化附件服务"""
27+ try :
28+ # 使用配置中的上传目录
29+ base_upload_dir = Path (getattr (settings , 'UPLOAD_DIR' , 'uploads' ))
30+ self .upload_dir = base_upload_dir / "email_attachments"
31+
32+ # 尝试创建目录
33+ self .upload_dir .mkdir (parents = True , exist_ok = True )
34+
35+ # 验证目录权限
36+ if not self ._check_directory_permissions ():
37+ raise PermissionError (f"无法写入上传目录: { self .upload_dir } " )
38+
39+ logger .info (f"附件服务初始化成功,上传目录: { self .upload_dir } " )
40+
41+ except PermissionError as e :
42+ logger .error (f"附件服务初始化失败 - 权限错误: { e } " )
43+ # 尝试使用临时目录作为备选方案
44+ self ._setup_fallback_directory ()
45+ except Exception as e :
46+ logger .error (f"附件服务初始化失败: { e } " )
47+ # 尝试使用临时目录作为备选方案
48+ self ._setup_fallback_directory ()
49+
50+ def _check_directory_permissions (self ) -> bool :
51+ """检查目录权限"""
52+ try :
53+ # 尝试创建测试文件
54+ test_file = self .upload_dir / ".permission_test"
55+ test_file .write_text ("test" )
56+ test_file .unlink ()
57+ return True
58+ except Exception as e :
59+ logger .warning (f"目录权限检查失败: { e } " )
60+ return False
61+
62+ def _setup_fallback_directory (self ):
63+ """设置备选目录"""
64+ try :
65+ import tempfile
66+ fallback_dir = Path (tempfile .gettempdir ()) / "kb_upload_genie" / "email_attachments"
67+ fallback_dir .mkdir (parents = True , exist_ok = True )
68+
69+ # 验证备选目录权限
70+ if self ._check_fallback_permissions (fallback_dir ):
71+ self .upload_dir = fallback_dir
72+ logger .warning (f"使用临时目录作为上传目录: { self .upload_dir } " )
73+ else :
74+ raise RuntimeError ("无法找到可写的上传目录" )
75+
76+ except Exception as e :
77+ logger .error (f"设置备选目录失败: { e } " )
78+ raise RuntimeError (f"附件服务初始化完全失败: { e } " )
79+
80+ def _check_fallback_permissions (self , directory : Path ) -> bool :
81+ """检查备选目录权限"""
82+ try :
83+ test_file = directory / ".permission_test"
84+ test_file .write_text ("test" )
85+ test_file .unlink ()
86+ return True
87+ except Exception :
88+ return False
2889
2990 def _get_file_hash (self , file_data : bytes ) -> str :
3091 """计算文件哈希值"""
0 commit comments