o2o-castad-backend/poc/blob/blob_storage.py

77 lines
3.4 KiB
Python

import aiohttp
from pathlib import Path
class BlobUploader():
root_url = "https://ado2mediastoragepublic.blob.core.windows.net/ado2-media-public-access/ado2-media-original/"
image_content_types = {
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".gif": "image/gif",
".webp": "image/webp",
".bmp": "image/bmp"
}
# SAS TOKEN 입력으로 저장
def __init__(self, sas_token):
self.sas_token = sas_token
# 음악 파일 업로드 (user_idx/task_idx/music_file_name 경로에 저장), 해당 업로드 링크 출력 / 실패 시 None
async def upload_music_to_azure_blob(self, file_data : bytes, user_idx : str, task_idx : str, music_file_name : str) -> str:
url = f"{self.root_url}/{user_idx}/{task_idx}/{music_file_name}"
access_url = f"{url}?{self.sas_token}"
headers = {
"Content-Type": "audio/mpeg",
"x-ms-blob-type": "BlockBlob"
}
async with aiohttp.ClientSession() as session:
async with session.put(access_url, data=file_data, headers=headers) as resp:
if resp.status in [200, 201]:
return url
else:
text = await resp.text()
print(f"Failed Status Code: {resp.status}")
print(f"Response: {text}")
return None
# 영상 파일 업로드 (user_idx/task_idx/video_file_name 경로에 저장), 해당 업로드 링크 출력 / 실패 시 None
async def upload_video_to_azure_blob(self, file_data : bytes, user_idx : str, task_idx : str, video_file_name : str) -> str:
url = f"{self.root_url}/{user_idx}/{task_idx}/{video_file_name}"
access_url = f"{url}?{self.sas_token}"
headers = {
"Content-Type": "video/mp4",
"x-ms-blob-type": "BlockBlob"
}
async with aiohttp.ClientSession() as session:
async with session.put(access_url, data=file_data, headers=headers) as resp:
if resp.status in [200, 201]:
return url
else:
text = await resp.text()
print(f"Failed Status Code: {resp.status}")
print(f"Response: {text}")
return None
# 이미지 파일 업로드 (user_idx/task_idx/image_file_name 경로에 저장), 해당 업로드 링크 출력 / 실패 시 None
async def upload_image_to_azure_blob(self, file_data : bytes, user_idx : str, task_idx : str, image_file_name : str) -> str:
url = f"{self.root_url}/{user_idx}/{task_idx}/{image_file_name}"
access_url = f"{url}?{self.sas_token}"
extension = Path(image_file_name).suffix.lower()
content_type = self.image_content_types.get(extension, "image/jpeg")
headers = {
"Content-Type": content_type,
"x-ms-blob-type": "BlockBlob"
}
async with aiohttp.ClientSession() as session:
async with session.put(access_url, data=file_data, headers=headers) as resp:
if resp.status in [200, 201]:
return url
else:
text = await resp.text()
print(f"Failed Status Code: {resp.status}")
print(f"Response: {text}")
return None