Django

네이버 Object Storage에 객체 업로드 하는 두 가지 방법

Going9 2023. 9. 19. 11:31

원래 아마존 s3를 쓰다가 네이버로 갈아탐. 네이버가 3개월 동안 10만 크레딧 쿠폰줌. 가격 자체도 좀 더 싸고 s3와 호환되기에 이식하는 데에 어려움 없었음.

 

1. 로컬에 파일 생성하고 스토리지에 올리기

    # image_source에 링크 저장
    image_source = detail_page.find_element(
        By.CSS_SELECTOR,
        "#imgExtensionArea #imgExtensionViewArea img"
    ).get_attribute("src")

    detail_page.close()

    # AWS 자격 증명 설정
    access_key = config('S3_ACCESS_KEY_ID')
    secret_key = config('S3_SECRET_ACCESS_KEY')
    service_name = 's3'
    endpoint_url = 'https://kr.object.ncloudstorage.com'

    # S3 클라이언트 생성
    s3 = boto3.client(service_name,
                      endpoint_url=endpoint_url,
                      aws_access_key_id=access_key,
                      aws_secret_access_key=secret_key
                      )

    # 이미지 파일 경로 설정
    image_path = os.path.join('원하는경로', parsed_name)

    # 이미지를 파일로 저장
    response = requests.get(image_source)
    with open(image_path, "wb") as image_file:
        image_file.write(response.content)

    # 업로드할 이미지 파일명과 S3 버킷 이름 설정
    # model_name, parsed_name은 그냥 내 프로젝트에서 사용하는 단어. 
    # 네이버 객체 스토리지에 model_name라는 경로에 parsed_name라는 이름으로 생성됨
    image_file_name = image_path
    bucket_name = 'test'
    object_key = f'{model_name}/{parsed_name}'

    # 이미지 업로드
    s3.upload_file(
        image_file_name,
        bucket_name,
        object_key,
        # 디비에 이미지가 바로 보이는 링크 저장하려고 아래 설정
        ExtraArgs={
            'ACL': 'public-read',
            'ContentType': 'image/jpeg'  # content-type을 'image/jpeg'로 지정
        }
    )

    # 이미지 url
    file_url = f"https://kr.object.ncloudstorage.com/{bucket_name}/{object_key}"

    # 파일 삭제
    try:
        os.remove(image_path)
        
    except FileNotFoundError:
        print(f"{image_path} 파일을 찾을 수 없습니다.")
        
    except Exception as e:
        print(f"파일 삭제 중 오류 발생: {e}")

 

2. 로컬에 따로 파일 생성하지 않고 스토리지에서 바로 객체 생성

# image_source에 저장
image_source = detail_page.find_element(
    By.CSS_SELECTOR,
    "#imgExtensionArea #imgExtensionViewArea img"
).get_attribute("src")

detail_page.close()

# AWS 자격 증명 설정
access_key = config('S3_ACCESS_KEY_ID')
secret_key = config('S3_SECRET_ACCESS_KEY')
service_name = 's3'
endpoint_url = 'https://kr.object.ncloudstorage.com'

# S3 클라이언트 생성
s3 = boto3.client(service_name,
                  endpoint_url=endpoint_url,
                  aws_access_key_id=access_key,
                  aws_secret_access_key=secret_key
                  )

bucket_name = 'test'
object_key = f'{model_name}/{parsed_name}'

# 이미지를 파일로 저장
response = requests.get(image_source)

# 파일을 바이트 스트림으로 읽고 S3 버킷에 업로드
try:
    s3.put_object(
        Bucket=bucket_name,
        Key=f'{model_name}/{parsed_name}',
        Body=response.content,
        ACL='public-read',
        ContentType='image/jpeg'
    )
    file_url = f"https://kr.object.ncloudstorage.com/{bucket_name}/{object_key}"

    return file_url

except NoCredentialsError:
    print("AWS 자격 증명이 없습니다.")
    return None

except Exception as e:
    print(f"파일 업로드 중 오류 발생: {e}")
    return None