uploader/main.py
Untone 8133d0030f
Some checks failed
Deploy on Push / deploy (push) Failing after 8s
uploader-upgrade
2024-05-06 12:00:57 +03:00

85 lines
2.3 KiB
Python

import logging
import os
import tempfile
import uuid
import aioboto3
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 settings import (
PORT,
STORJ_ACCESS_KEY,
STORJ_SECRET_KEY,
CDN_DOMAIN,
STORJ_BUCKET_NAME,
STORJ_END_POINT,
)
# Logging configuration
logging.basicConfig(
level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s"
)
@login_required
async def upload_handler(request: Request):
logging.debug("Received upload request")
form = await request.form()
file = form.get("file")
if file is None:
logging.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
logging.debug(f"Generated file key: {key}")
async with aioboto3.client(
"s3",
aws_access_key_id=STORJ_ACCESS_KEY,
aws_secret_access_key=STORJ_SECRET_KEY,
endpoint_url=STORJ_END_POINT,
) as s3:
with tempfile.NamedTemporaryFile() as tmp_file:
while True:
chunk = await file.read(8192)
if not chunk:
break
tmp_file.write(chunk)
tmp_file.flush()
logging.debug("Starting file upload to S3")
await s3.upload_file(
Filename=tmp_file.name,
Bucket=STORJ_BUCKET_NAME,
Key=key,
ExtraArgs={"ContentType": file.content_type},
)
logging.debug("File upload completed")
url = f"http://{CDN_DOMAIN}/{key}"
logging.info(f"File uploaded successfully: {url}")
return JSONResponse({"url": url, "originalFilename": file.filename})
async def home(request: Request):
logging.debug("Home route called")
return JSONResponse({"message": "Hello World!"})
routes = [
Route("/test", home, methods=["GET"]),
Route("/", upload_handler, methods=["POST"]),
]
app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=PORT)