feat: add template upload endpoint
This commit is contained in:
@@ -1,15 +1,24 @@
|
||||
"""模板相关业务逻辑"""
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from uuid import uuid4
|
||||
|
||||
from fastapi import UploadFile
|
||||
from sqlalchemy.orm import Session
|
||||
from ..models.template import Template
|
||||
from .storage import upload_file
|
||||
|
||||
|
||||
ALLOWED_EXTENSIONS = {".docx"}
|
||||
MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB
|
||||
TEMPLATE_BUCKET = "templates"
|
||||
|
||||
|
||||
def validate_file(file: UploadFile):
|
||||
"""校验文件格式和大小"""
|
||||
if not file.filename:
|
||||
raise ValueError("文件名不能为空")
|
||||
|
||||
ext = "." + file.filename.rsplit(".", 1)[-1].lower() if "." in file.filename else ""
|
||||
if ext not in ALLOWED_EXTENSIONS:
|
||||
raise ValueError(f"不支持的文件格式: {ext},仅支持 .docx")
|
||||
@@ -21,6 +30,21 @@ def validate_file(file: UploadFile):
|
||||
return content
|
||||
|
||||
|
||||
def build_template_file_path(filename: str) -> str:
|
||||
"""生成模板文件存储路径。"""
|
||||
suffix = Path(filename).suffix.lower()
|
||||
today = datetime.now().strftime("%Y%m%d")
|
||||
return f"{today}/{uuid4().hex}{suffix}"
|
||||
|
||||
|
||||
def store_template_file(file: UploadFile) -> tuple[str, bytes]:
|
||||
"""校验并保存上传的模板文件,返回存储路径和文件内容。"""
|
||||
content = validate_file(file)
|
||||
file_path = build_template_file_path(file.filename or "template.docx")
|
||||
stored_path = upload_file(TEMPLATE_BUCKET, file_path, content)
|
||||
return stored_path, content
|
||||
|
||||
|
||||
def create_template_record(db: Session, name: str, file_path: str, type: str = "report") -> Template:
|
||||
"""创建模板记录"""
|
||||
tmpl = Template(name=name, type=type, original_file_path=file_path)
|
||||
|
||||
Reference in New Issue
Block a user