From 5c4c02aa840e46b015e516d0cf96b8cfeabccfce Mon Sep 17 00:00:00 2001 From: Stepan Vladovskiy Date: Tue, 7 May 2024 21:37:40 -0300 Subject: [PATCH] feat: back old main.py with boto3 --- main.py | 88 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/main.py b/main.py index 268e905..51c0360 100644 --- a/main.py +++ b/main.py @@ -1,68 +1,70 @@ import os import tempfile import uuid -from aiobotocore.session import get_session -import asyncio +import boto3 +from botocore.exceptions import BotoCoreError, ClientError 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 auth import check_auth -from settings import ( - PORT, - STORJ_ACCESS_KEY, - STORJ_SECRET_KEY, - CDN_DOMAIN, - STORJ_BUCKET_NAME, - STORJ_END_POINT, -) -async def create_s3_client(): - session = get_session() - return session.create_client( - "s3", - aws_access_key_id=STORJ_ACCESS_KEY, - aws_secret_access_key=STORJ_SECRET_KEY, - endpoint_url=STORJ_END_POINT, - ) +STORJ_ACCESS_KEY = os.environ.get('STORJ_ACCESS_KEY') +STORJ_SECRET_KEY = os.environ.get('STORJ_SECRET_KEY') +STORJ_END_POINT = os.environ.get('STORJ_END_POINT') +STORJ_BUCKET_NAME = os.environ.get('STORJ_BUCKET_NAME') +CDN_DOMAIN = os.environ.get('CDN_DOMAIN') -@login_required + +@check_auth async def upload_handler(request: Request): - logger.debug("Received upload request") form = await request.form() - file = form.get("file") + file = form.get('file') if file is None: - logger.error("No file uploaded") - return JSONResponse({"error": "No file uploaded"}, status_code=400) + 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}") - async with create_s3_client() as s3: - logger.debug("Starting file upload to S3") - content = await file.read() - resp = await s3.put_object( - Bucket=STORJ_BUCKET_NAME, - Key=key, - Body=content, - ContentType=file.content_type, - ) - logger.debug("File upload completed") + s3 = boto3.client('s3', + aws_access_key_id=STORJ_ACCESS_KEY, + aws_secret_access_key=STORJ_SECRET_KEY, + endpoint_url=STORJ_END_POINT) - url = f"http://{CDN_DOMAIN}/{key}" - logger.info(f"File uploaded successfully: {url}") - return JSONResponse({"url": url, "originalFilename": file.filename}) + try: + with tempfile.NamedTemporaryFile() as tmp_file: + while True: + chunk = await file.read(8192) # 8192 bytes by default. + if not chunk: + break + tmp_file.write(chunk) -async def home(request: Request): - logger.debug("Home route called") - return JSONResponse({"message": "Hello World!"}) + s3.upload_file( + Filename=tmp_file.name, + Bucket=STORJ_BUCKET_NAME, + Key=key, + ExtraArgs={ + "ContentType": file.content_type + } + ) + + url = 'http://' + CDN_DOMAIN + '/' + key + + return JSONResponse({'url': url, 'originalFilename': file.filename}) + + except (BotoCoreError, ClientError) as e: + print(e) + return JSONResponse({'error': 'Failed to upload file'}, status_code=500) routes = [ - Route("/", upload_handler, methods=["POST"]), + 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=80) + \ No newline at end of file