54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
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)
|