81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
from dataclasses import dataclass
|
||
from typing import List, Optional
|
||
from app.core.upload_enums import UploadContext
|
||
|
||
|
||
@dataclass
|
||
class UploadPolicy:
|
||
"""上传策略,定义文件大小限制、允许的文件类型等规则"""
|
||
max_file_size: int # 最大文件大小(字节)
|
||
allowed_extensions: List[str] # 允许的文件扩展名列表
|
||
allowed_mime_types: List[str] # 允许的 MIME 类型列表
|
||
require_authentication: bool = True # 是否需要认证
|
||
enable_virus_scan: bool = False # 是否启用病毒扫描
|
||
enable_compression: bool = False # 是否启用压缩
|
||
auto_delete_after_days: Optional[int] = None # 自动删除天数(None 表示不自动删除)
|
||
|
||
|
||
# 各上下文的上传策略配置
|
||
UPLOAD_POLICIES = {
|
||
UploadContext.AVATAR: UploadPolicy(
|
||
max_file_size=5 * 1024 * 1024, # 5MB
|
||
allowed_extensions=[".jpg", ".jpeg", ".png", ".gif", ".webp"],
|
||
allowed_mime_types=["image/jpeg", "image/png", "image/gif", "image/webp"],
|
||
require_authentication=True,
|
||
enable_compression=True,
|
||
),
|
||
UploadContext.APP_ICON: UploadPolicy(
|
||
max_file_size=2 * 1024 * 1024, # 2MB
|
||
allowed_extensions=[".jpg", ".jpeg", ".png", ".svg"],
|
||
allowed_mime_types=["image/jpeg", "image/png", "image/svg+xml"],
|
||
require_authentication=True,
|
||
enable_compression=True,
|
||
),
|
||
UploadContext.KNOWLEDGE_BASE: UploadPolicy(
|
||
max_file_size=50 * 1024 * 1024, # 50MB
|
||
allowed_extensions=[".pdf", ".doc", ".docx", ".txt", ".md", ".xlsx", ".csv"],
|
||
allowed_mime_types=[
|
||
"application/pdf",
|
||
"application/msword",
|
||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||
"text/plain",
|
||
"text/markdown",
|
||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||
"text/csv",
|
||
],
|
||
require_authentication=True,
|
||
enable_virus_scan=True,
|
||
),
|
||
UploadContext.TEMP: UploadPolicy(
|
||
max_file_size=10 * 1024 * 1024, # 10MB
|
||
allowed_extensions=[], # 允许所有类型
|
||
allowed_mime_types=[], # 允许所有类型
|
||
require_authentication=True,
|
||
auto_delete_after_days=7,
|
||
),
|
||
UploadContext.ATTACHMENT: UploadPolicy(
|
||
max_file_size=20 * 1024 * 1024, # 20MB
|
||
allowed_extensions=[], # 允许所有类型
|
||
allowed_mime_types=[], # 允许所有类型
|
||
require_authentication=True,
|
||
),
|
||
}
|
||
|
||
|
||
def get_upload_policy(context: UploadContext) -> UploadPolicy:
|
||
"""
|
||
根据上传上下文获取对应的上传策略
|
||
|
||
Args:
|
||
context: 上传上下文
|
||
|
||
Returns:
|
||
对应的上传策略
|
||
|
||
Raises:
|
||
ValueError: 如果上下文不存在对应的策略
|
||
"""
|
||
if context not in UPLOAD_POLICIES:
|
||
raise ValueError(f"未定义上传上下文 '{context}' 的策略")
|
||
return UPLOAD_POLICIES[context]
|