s3에 이미지 업로드

2023. 1. 17. 13:47Bootcamp_Winter_TeamL

1. main.py(라우터 생성)

app = FastAPI()

app.include_router(aws_router.router)

라우터를 사용하기 위해 선언해준다

 

2. connection.py(s3연결)

import boto3
from .aws_key import AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY
#사용자 접근 키#
AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=AWS_SECRET_ACCESS_KEY

class Connect:
    def __init__(self):
        self.client = boto3.client(
            "s3",
            aws_access_key_id=AWS_ACCESS_KEY_ID,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        )

    def __enter__(self):
        return self 

    def connect(self):
        return self.client

    def __exit__(self, exc_type, exc_val, exc_tb):
        ...

                                                              import boto3 -> s3와 연동하기위해 boto3를 설치한 후 사용

                                                              aws_key에 access 키와 secret access키를 작성 후 받아옴-> 키는 노출되면 안되기 때문                                                     

 3. aws_router.py(사진 업로드)

async def load_photo(file:UploadFile=File(...), type :Optional[str]=None, user :Optional[int]=None, db: Session=Depends(get_db)):
    filename=f"{type}_{user}_{uuid.uuid4()}.jpeg"
    content=await file.read()
    post_bucket(content,filename)
    return filename, type, user

UploadFile=File(...) -> 파일을 받아오는 메소드

filename -> 파일 이름 지정(uuid는 파일 구분을 위해 난수 생성 -> s3에 같은 이름의 파일이 올라가면 덮어씌워짐)

 

4. bucket.py

def post_bucket(image_file: str, key_name: str):
    connect = Connect()
    with connect as client:
        try:
            client = connect.connect()
            client.put_object(
                Body=image_file, Bucket=S3_BUCKET, Key=key_name, ContentType="image.jpeg"
            )
        except ClientError as e:
            print("Error during image upload. {}".format(e.response["Error"]["Code"]))

connect = Connect() -> connection.py에 있는 Connect함수를 이용해 s3에 연결

client.put_object -> s3에 파일을 업로드 하기 위한 함수(정확히는 오브젝트 업로드)

          Body=image_file -> 파일이 이미지 파일임을 명시

          Bucket=S3_BUCKET -> S3버킷의 이름 명시(상수로 정의)

          Key=key_name -> aws_router.py에서 받아온 s3에 업로드 될 파일

          ContentType="image.jpeg" -> 이미지 파일이 들어간다고 선언