import datetime from pathlib import Path from typing import Optional from fastapi import UploadFile from sqlmodel import Field from app.config.env import env from app.model.BasicModel import BasicModel from app.utils.create_module_service import create_model_service from app.utils.db_utils import AsyncSessionDep from app.utils.next_id import next_id from app.utils.path_join import path_join class FileModel(BasicModel, table=True): __tablename__ = "pl_upload" name: Optional[str] = Field(default=None, description='文件名称') path: Optional[str] = Field(default=None, description='文件路径') head_id: Optional[str] = Field(default=None, description='父对象id') attr1: Optional[str] = Field(default=None, description='扩展属性1') attr2: Optional[str] = Field(default=None, description='扩展属性2') attr3: Optional[str] = Field(default=None, description='扩展属性3') FileService = create_model_service(Cls=FileModel) # 文件保存服务 class FileSaveService: # 将文件保存到服务本地目录 # 并且往附件表中插入对应的文件记录 @staticmethod async def saveFile( session: AsyncSessionDep, file: UploadFile, filename: str, id: str = None, file_record: dict = None, ): if not id: id = await next_id() datetime_string = datetime.datetime.now().strftime("%Y%m%d%H%M%S") file_id = f"{datetime_string}_{id}" save_path = path_join(env.file_save_path, file_id).replace('\\', '/') print("save_path", save_path) public_path = path_join(env.file_public_path, file_id).replace('\\', '/') print("public_path", public_path) # parents=True 表示创建所有不存在的父目录 # exist_ok=True 表示如果目录已存在不抛出异常 Path(save_path).mkdir(parents=True, exist_ok=True) file_save_path = path_join(save_path, filename) file_public_path = path_join(public_path, filename) with open(file_save_path, 'wb') as f: f.write(await file.read()) file_dict = { "id": id, "name": filename, "path": file_public_path, **file_record, } file_cls = await FileService.item_insert(session=session, row_dict=file_dict) return {"result": file_cls.model_dump()}