import os import uuid from fastapi import UploadFile from pathlib import Path # Путь для сохранения изображений IMAGES_DIR = Path("static/images") # Разрешенные типы файлов ALLOWED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".webp"} async def save_image(file: UploadFile) -> str: """ Сохраняет изображение в директорию и возвращает относительный путь к нему """ if not file: return None # Получаем расширение файла _, ext = os.path.splitext(file.filename) if ext.lower() not in ALLOWED_EXTENSIONS: raise ValueError(f"Неподдерживаемый формат файла. Поддерживаемые форматы: {', '.join(ALLOWED_EXTENSIONS)}") # Создаем уникальное имя файла filename = f"{uuid.uuid4()}{ext}" file_path = IMAGES_DIR / filename # Создаем директорию, если не существует os.makedirs(IMAGES_DIR, exist_ok=True) # Сохраняем файл contents = await file.read() with open(file_path, "wb") as f: f.write(contents) # Возвращаем относительный путь для хранения в базе данных return f"/static/images/{filename}" def delete_image(image_path: str) -> None: """ Удаляет файл изображения, если оно существует """ if not image_path: return # Удаляем первый слэш из пути, если есть if image_path.startswith("/"): image_path = image_path[1:] full_path = Path(image_path) if full_path.exists(): os.unlink(full_path)