Files
ai-admin-server/app/model/FileModel.py
T

72 lines
2.2 KiB
Python

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()}