I’m building a FASTAPI endpoint to upload a file into a S3 bucket with bucket name and path as input parameters. When i don’t specify the file path, the file is getting uploaded successfully. But when i mention the path, the file is not getting uploaded. Please help me to fix this issue.
#upload.py
from fastapi import FastAPI, File, UploadFile, HTTPException, Depends
from pydantic import BaseModel
from typing import Optional
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, ClientError
import boto3
import uvicorn
app = FastAPI()
AWS_ACCESS_KEY = "XXX"
AWS_SECRET_KEY = "YYY"
AWS_REGION_NAME = "ap-northeast-1"
# Pydantic model for the request body
class S3UploadRequest(BaseModel):
bucket_name: str
file_path: Optional[str] = None # Make file_path optional
@app.post("/upload/")
async def upload_file_to_s3(
s3_request: S3UploadRequest = Depends(),
file: UploadFile = File(...)
):
"""
Upload a file to an S3 bucket.
:param s3_request: S3UploadRequest. Contains the bucket name and file path.
:param file: UploadFile. The file to upload.
"""
try:
s3_client = boto3.client(
's3',
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY,
region_name=AWS_REGION_NAME
)
# Set default file path if not provided
if s3_request.file_path is None:
s3_request.file_path = file.filename
# Upload file to S3
s3_client.upload_fileobj(file.file, s3_request.bucket_name, s3_request.file_path)
return {
"message": f"File '{file.filename}' uploaded successfully to bucket '{s3_request.bucket_name}' at '{s3_request.file_path}'"}
except NoCredentialsError:
raise HTTPException(status_code=403, detail="AWS credentials not found.")
except PartialCredentialsError:
raise HTTPException(status_code=403, detail="Incomplete AWS credentials.")
except ClientError as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app='upload:app', reload=True)