JourneyPoint / journeypoint / app / s3_utils.py
s3_utils.py
Raw
import boto3
from fastapi import UploadFile
from botocore.exceptions import NoCredentialsError
from app.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_S3_BUCKET_NAME  # s3 creds

# s3 client setup
s3 = boto3.client(
    "s3",
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name=AWS_REGION,
)


# upload an image file to our amazon S3 bucket, it returns the public URL of
# the uploaded file for storage in respective postgres tables.
# robust file storage; it can store pngs, jpgs, pdfs, gifs...
def upload_image_to_s3(file: UploadFile, filename, folder="uploads/"):
    try:
        file_key = f"{folder}{filename}"
        s3.upload_fileobj(
            file.file,
            AWS_S3_BUCKET_NAME,
            file_key,
            ExtraArgs={"ContentType": file.content_type}
        )
        return f"https://{AWS_S3_BUCKET_NAME}.s3.{AWS_REGION}.amazonaws.com/{file_key}"
    except NoCredentialsError:
        return {"error": "AWS credentials not found"}