From 9b85df8b40bafcc89766d0c2f7e41f9d0302db0d Mon Sep 17 00:00:00 2001 From: Keika Hatanaka Date: Thu, 20 Feb 2025 14:37:56 +0900 Subject: [PATCH] 1st --- .gitignore | 1 + upload.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 .gitignore create mode 100755 upload.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/upload.py b/upload.py new file mode 100755 index 0000000..6247e3d --- /dev/null +++ b/upload.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import argparse +from dotenv import load_dotenv +import boto3 +import mimetypes +import uuid + +# .envファイルから環境変数を読み込む +load_dotenv() + +# .envファイルからCloudflare R2のエンドポイントを読み込む +ENDPOINT = os.getenv('R2_ENDPOINT') + +def upload_to_r2(image_path): + """ + 画像をCloudflare R2にアップロードする。 + + Args: + image_path (str): アップロードする画像のパス。 + + Returns: + str: アップロードされた画像のURL。 + int: アップロードに失敗した場合のエラーコード。 + """ + + try: + # R2のクライアントを作成 + s3 = boto3.client( + 's3', + endpoint_url=ENDPOINT, + aws_access_key_id=os.getenv('R2_ACCESS_KEY_ID'), + aws_secret_access_key=os.getenv('R2_SECRET_ACCESS_KEY'), + config=boto3.session.Config(signature_version='s3v4') + ) + + # ランダムなファイル名を生成(拡張子は元のまま) + random_filename = str(uuid.uuid4()) + os.path.splitext(image_path)[1] + + # 画像のContentTypeをファイル名から推測 + content_type, _ = mimetypes.guess_type(image_path) + + # 画像をアップロード + with open(image_path, 'rb') as f: + bucket_name = os.getenv('R2_BUCKET_NAME') + s3.put_object(Bucket=bucket_name, Key=random_filename, Body=f, ContentType=content_type) + + # アップロードされた画像のURLを返す + return f"{os.getenv('R2_CUSTOM_URL')}{random_filename}" + + except Exception as e: + print(f"Error uploading image: {e}") + return None + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Upload an image to Cloudflare R2.') + parser.add_argument('--image-path', required=True, help='Path to the image file.') + args = parser.parse_args() + + image_path = args.image_path + + # 画像が存在するか確認 + if not os.path.exists(image_path): + print(f"Error: Image not found at {image_path}") + exit(1) + + # R2に画像をアップロード + image_url = upload_to_r2(image_path) + + if image_url: + print(f"{image_url}") + else: + print("Image upload failed.") \ No newline at end of file