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