41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
import os
|
|
import uuid
|
|
import aiofiles
|
|
from app.application.files_repository import FilesRepository
|
|
|
|
|
|
class FilesService:
|
|
def __init__(self, db):
|
|
self.repo = FilesRepository(db)
|
|
# Базовый путь относительно корня проекта
|
|
self.base_dir = "База данных/media"
|
|
|
|
async def _save_to_disk(self, upload_file, sub_folder: str):
|
|
# Генерируем уникальное имя, чтобы не перезаписать файлы
|
|
unique_name = f"{uuid.uuid4()}_{upload_file.filename}"
|
|
relative_folder = os.path.join(sub_folder)
|
|
full_folder_path = os.path.join(self.base_dir, relative_folder)
|
|
|
|
os.makedirs(full_folder_path, exist_ok=True)
|
|
|
|
file_path = os.path.join(full_folder_path, unique_name)
|
|
# URL для раздачи статикой
|
|
web_url = f"/media/{sub_folder}/{unique_name}"
|
|
|
|
content = await upload_file.read()
|
|
async with aiofiles.open(file_path, mode='wb') as f:
|
|
await f.write(content)
|
|
|
|
return {
|
|
"filename": upload_file.filename,
|
|
"path": file_path,
|
|
"url": web_url
|
|
}
|
|
|
|
async def upload_logo(self, file):
|
|
info = await self._save_to_disk(file, "company_logos")
|
|
return await self.repo.create_logo_record(**info)
|
|
|
|
async def upload_photo(self, file):
|
|
info = await self._save_to_disk(file, "company_photos")
|
|
return await self.repo.create_photo_record(**info) |