base64 エンコードされた画像を Cloud Storage にアップロードする方法のメモ。
プログラム
アップロード時に content_type を指定しないと、テキストデータとして扱われます。
# usage: uplaod_base64_image_to_gcs.py {bucket} {dir} < {json} import sys import base64 import json from google.cloud import storage def upload_to_gcs(bucket, dir, obj): img_bytes = base64.b64decode(obj['image_base64']) blob = bucket.blob(f"{dir}/{obj['file_name']}") blob.upload_from_string(img_bytes, content_type='image/jpeg') def main(): gcs_bucket = sys.argv[1] gcs_dir = sys.argv[2] client = storage.Client() bucket = client.bucket(gcs_bucket) for line in sys.stdin: obj = json.loads(line) upload_to_gcs(bucket, gcs_dir, obj) return 0 if __name__ == '__main__': res = main() exit(res)
データ
$ cat data.jsonl {"id":"01","file_name":"01.jpg","image_base64":"/9j/4AAQSkZJ..."} {"id":"02","file_name":"02.jpg","image_base64":"/9j/4AAQSkZJ..."}
プログラム実行・実行結果確認
$ cat data.jsonl | python upload_base64_image_to_gcs.py gcs-bucket-001 images $ gsutil ls -L gs://gcs-bucket-001/images/*.jpg gs://gcs-bucket-001/images/01.jpg: ... Storage class: STANDARD Content-Length: 28300 Content-Type: image/jpeg ... gs://gcs-bucket-001/images/02.jpg: ... Storage class: STANDARD Content-Length: 21648 Content-Type: image/jpeg ...