#!/usr/bin/python # -*- coding: utf-8 -*- # @version : 1.0 # @Creaet Time : 2022/12/12 14:31 # @File : file_base.py # @IDE : PyCharm # @desc : 简要说明 import datetime import os import uuid from fastapi import UploadFile from core.exception import CustomException from utils import status class FileBase: IMAGE_ACCEPT = ["image/png", "image/jpeg", "image/gif", "image/x-icon"] VIDEO_ACCEPT = ["audio/mp4", "video/mp4", "video/mpeg"] ALL_ACCEPT = [*IMAGE_ACCEPT, *VIDEO_ACCEPT] @classmethod def generate_path(cls, path: str, filename): """ 生成文件路径 """ if path[0] == "/": path = path[1:] if path[-1] == "/": path = path[:-1] full_date = datetime.datetime.now().date() _filename = str(int(datetime.datetime.now().timestamp())) + str(uuid.uuid4())[:8] return f"{path}/{full_date}/{_filename}{os.path.splitext(filename)[-1]}" @classmethod async def validate_file(cls, file: UploadFile, max_size: int = None, mime_types: list = None) -> bool: """ 验证文件是否符合格式 @params max_size: 文件最大值,单位 MB """ if max_size: size = len(await file.read()) / 1024 / 1024 if size > max_size: raise CustomException(f"上传文件过大,不能超过{max_size}MB", status.HTTP_ERROR) await file.seek(0) if mime_types: if file.content_type not in mime_types: raise CustomException(f"上传文件格式错误,只支持 {'/'.join(mime_types)} 格式!", status.HTTP_ERROR) return True @classmethod def get_file_type(cls, content_type: str) -> str | None: """ 获取文件类型 0: 图片 1:视频 """ if content_type in cls.IMAGE_ACCEPT: return "0" elif content_type in cls.VIDEO_ACCEPT: return "1" else: return None