☝️
boto3でMIMEタイプを指定しながらS3にアップロードする
この記事の概要
intro
Lambdaを使用して、S3にファイルを同期する仕組みを作成していた時のこと
アップロードした画像オブジェクトをブラウザで開いても
何故かダウンロードのダイアログが出るのみで、画像が表示されない。
調べるとどうやらmimeタイプがデフォルトのままで画像になっていないようだ。
実装
拡張子を基にコンテンツタイプを返却するメソッドを作成
サンプルコード(python)
def get_content_type(ext):
typelist = {
"txt": "text/plain",
"html": "text/html",
"css": "text/css",
"js": "text/javascript",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"png": "image/png",
"tif": "image/tiff",
"bmp": "image/bmp",
"pdf": "application/pdf",
"ico": "image/vnd.microsoft.icon",
"swf": "application/x-shockwave-flash",
"gif": "image/gif",
"woff": "application/font-woff",
"woff2": "application/font-woff2",
"ttf": "application/x-font-ttf",
"otf": "application/x-font-otf",
"svg": "image/svg+xml",
"eot": "application/vnd.ms-fontobject",
"mp4": "video/mp4",
"webm": "video/webm",
"webp": "image/webp",
"xml": "text/xml",
"mp3": "audio/mpeg"
}
if ext.lower() in typelist.keys():
return typelist[ext.lower()]
else:
return "binary/octet-stream"
コンテンツタイプを取得して、アップロード時に指定
サンプルコード(python)
# 拡張子判定
content_type = get_content_type(dst_filepath.split(".")[-1])
# アップロード
s3.Bucket(bucket_name).upload_file(src_path, dst_filepath, ExtraArgs={'ContentType': content_type })
outro
aws s3 cp はmimeタイプをguess(自動判定)してくれるだけに
アップロード時の指定は意識してませんでした。
この辺も、そのうち自動で認識するようになったりするといいですね。
boto3公式ドキュメント(upload_file)
Discussion