import random import shutil import string import os from io import BytesIO from PIL import Image from fastapi import FastAPI, UploadFile from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware def generate_random_string(length=16): """Генерирует случайную строку заданной длины.""" characters = string.ascii_letters + string.digits return ''.join(random.choice(characters) for _ in range(length)) app = FastAPI( prefix="/api", tags=["Сервак для загрузки"], ) origins = [] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"], allow_headers=[ "Content-Type", "Set-Cookie", "Access-Control-Allow-Headers", "Authorization", "Accept" ], ) app.mount("/static", StaticFiles(directory="app/static"), name="static") @app.post('/upload_avatar', response_model=dict[str, str]) async def upload_avatar(file: UploadFile): content = await file.read() image = Image.open(BytesIO(content)) new_size = (512, 512) resized_image = image.resize(new_size) name = generate_random_string() image_url = f'static/images/avatars/{name}_avatar.png' with open('app/' + image_url, 'wb+') as file_object: resized_image.save(file_object, format="PNG") return {'image_url': image_url} @app.post('/upload_image', response_model=dict[str, str]) async def upload_image(file: UploadFile): name = generate_random_string(50) image_url = f'static/images/images/{name}_image.png' with open('app/' + image_url, 'wb+') as file_object: shutil.copyfileobj(file.file, file_object) return {'image_url': image_url} @app.post('/upload_background', response_model=list[str]) async def upload_background(file: UploadFile): name = generate_random_string() image_url = f'static/images/backgrounds/{name}_background.png' with open('app/' + image_url, 'wb+') as file_object: shutil.copyfileobj(file.file, file_object) backgrounds = ['static/images/backgrounds/' + background for background in os.listdir('app/static/images/backgrounds')] return backgrounds