uploader/main.py
Untone 9b6cd9cc37
All checks were successful
Deploy on Push / deploy (push) Successful in 31s
upload-fn-fix-3
2024-05-06 15:42:07 +03:00

80 lines
1.9 KiB
Python

import os
import tempfile
import uuid
import aiobotocore.session
import asyncio
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from starlette.requests import Request
from auth import login_required
from logger import root_logger as logger
from settings import (
PORT,
STORJ_ACCESS_KEY,
STORJ_SECRET_KEY,
CDN_DOMAIN,
STORJ_BUCKET_NAME,
STORJ_END_POINT,
)
async def create_s3_client():
return (
aiobotocore.session.get_session()
.create_client(
"s3",
aws_access_key_id=STORJ_ACCESS_KEY,
aws_secret_access_key=STORJ_SECRET_KEY,
endpoint_url=STORJ_END_POINT,
)
)
@login_required
async def upload_handler(request: Request):
logger.debug("Received upload request")
form = await request.form()
file = form.get("file")
if file is None:
logger.error("No file uploaded")
return JSONResponse({"error": "No file uploaded"}, status_code=400)
file_name, file_extension = os.path.splitext(file.filename)
key = str(uuid.uuid4()) + file_extension
logger.debug(f"Generated file key: {key}")
s3 = await create_s3_client()
object_resource = s3.Object(STORJ_BUCKET_NAME, key)
logger.debug("Starting file upload to S3")
content = await file.read()
await object_resource.put(
Body=content,
ContentType=file.content_type,
)
logger.debug("File upload completed")
url = f"http://{CDN_DOMAIN}/{key}"
logger.info(f"File uploaded successfully: {url}")
return JSONResponse({"url": url, "originalFilename": file.filename})
async def home(request: Request):
logger.debug("Home route called")
return JSONResponse({"message": "Hello World!"})
routes = [
Route("/", home, methods=["GET"]),
Route("/", upload_handler, methods=["POST"]),
]
app = Starlette(debug=True, routes=routes)