☝️

boto3でMIMEタイプを指定しながらS3にアップロードする

2022/06/17に公開

この記事の概要

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)

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file

Discussion