この Topic では、シンプルアップロードメソッドを使用して単一のファイルを OSS にアップロードする方法について説明します。このメソッドはシンプルで、クラウドストレージへの高速なファイルアップロードに適しています。
重要
この Topic のサンプルコードでは、リージョン ID cn-hangzhou (中国 (杭州)) を例として使用しています。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用する必要があります。OSS リージョンとエンドポイントのマッピングの詳細については、「OSS リージョンとエンドポイント」をご参照ください。
権限
デフォルトでは、Alibaba Cloud アカウントは完全な権限を持っています。Alibaba Cloud アカウント下の RAM ユーザーまたは RAM ロールは、デフォルトでは何の権限も持っていません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを介して操作権限を付与する必要があります。
API | アクション | 定義 |
PutObject | oss:PutObject
| オブジェクトをアップロードします。 |
oss:PutObjectTagging
| オブジェクトのアップロード時に x-oss-tagging を介してオブジェクトタグを指定する場合、この権限が必要です。 |
kms:GenerateDataKey
| オブジェクトのアップロード時に、オブジェクトのメタデータに X-Oss-Server-Side-Encryption: KMS が含まれている場合、これら 2 つの権限が必要です。 |
kms:Decrypt
|
メソッド定義
put_object(request: PutObjectRequest, **kwargs) → PutObjectResult
リクエストパラメーター
パラメーター | タイプ | 説明 |
request | PutObjectRequest | オブジェクトのアクセス制御リスト (ACL)、上書きを禁止するかどうか (ForbidOverwrite)、カスタムメタデータ (Metadata) などのリクエストパラメーターを指定します。詳細については、「PutObjectRequest」をご参照ください。 |
戻り値
シンプルアップロードメソッドの完全な定義については、「put_object」をご参照ください。
ローカルファイルのアップロード
オブジェクトをアップロードする際、同じ名前のオブジェクトがバケットに既に存在し、かつ必要な権限を持っている場合、新しいオブジェクトが既存のオブジェクトを上書きします。
ファイルをアップロードするための共通パラメーターは次のとおりです。
パラメーター | 説明 |
bucket_name | バケット名。 |
object_name | オブジェクトの完全なパス。完全なパスにバケット名を含めることはできません。 |
put_object_from_file メソッドを使用して、ローカルファイルを宛先バケットにアップロードできます。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object from file sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
# アップロードするローカルファイルのパスを指定する --file_path コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--file_path', help='The path of Upload file.', required=True)
def main():
# コマンドライン引数を解析します。
args = parser.parse_args()
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# ソフトウェア開発キット (SDK) のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# ファイルから直接オブジェクトをアップロードするリクエストを実行します。
# バケット名、オブジェクト名、およびローカルファイルのパスを指定します。
result = client.put_object_from_file(
oss.PutObjectRequest(
bucket=args.bucket, # バケットの名前。
key=args.key # オブジェクトの名前。
),
args.file_path # ローカルファイルのパス。
)
# リクエストの結果情報 (ステータスコード、リクエスト ID、Content-MD5、ETag、64 ビット巡回冗長検査 (CRC64) ハッシュ、バージョン ID、サーバー応答時間など) を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
f' server time: {result.headers.get("x-oss-server-time")},'
)
# スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。
if __name__ == "__main__":
main()
put_object メソッドを使用してローカルファイルをアップロードする場合、ファイルを 'rb' モードで開く必要があります。これにより、テキストコンテンツではなく元のバイトストリームがアップロードされることが保証され、巡回冗長検査 (CRC) の失敗を防ぎます。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object from file sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# コマンドライン引数を解析します。
args = parser.parse_args()
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# ローカルファイルから直接オブジェクトをアップロードするリクエストを実行します。
# バケット名、オブジェクト名、およびローカルファイルのパスを指定します。
with open('your-test-file.md', 'rb') as f:
result = client.put_object(
oss.PutObjectRequest(
bucket=args.bucket, # バケットの名前。
key=args.key, # オブジェクトの名前。
body=f.read() # ファイルの内容を読み取ります。
)
)
# リクエストの結果情報 (ステータスコード、リクエスト ID、Content-MD5、ETag、CRC64 ハッシュ、バージョン ID、サーバー応答時間など) を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
f' server time: {result.headers.get("x-oss-server-time")},'
)
# スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。
if __name__ == "__main__":
main()
一般的なシナリオ
文字列のアップロード
次のコードを使用して、文字列を宛先バケットにアップロードできます。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
args = parser.parse_args() # コマンドライン引数を解析します。
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# アップロードする文字列を定義します。
text_string = "Hello, OSS!"
data = text_string.encode('utf-8') # 文字列を UTF-8 バイト文字列にエンコードします。
# オブジェクトをアップロードするリクエストを実行します。バケット名、オブジェクト名、データコンテンツを指定します。
result = client.put_object(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
body=data,
))
# リクエスト結果のステータスコード、リクエスト ID、Content-MD5、ETag、CRC64 ハッシュ、バージョン ID を出力して、リクエストが成功したかどうかを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main() # スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。
バイト配列のアップロード
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
args = parser.parse_args() # コマンドライン引数を解析します。
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# アップロードするデータコンテンツを定義します。
data = b'hello world'
# オブジェクトをアップロードするリクエストを実行します。バケット名、オブジェクト名、データコンテンツを指定します。
result = client.put_object(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
body=data,
))
# リクエスト結果のステータスコード、リクエスト ID、Content-MD5、ETag、CRC64 ハッシュ、バージョン ID を出力して、リクエストが成功したかどうかを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main() # スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。
ネットワークストリームのアップロード
次のコードを使用して、ネットワークストリームを宛先バケットにアップロードできます。
import argparse
import requests
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
args = parser.parse_args() # コマンドライン引数を解析します。
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# HTTP GET リクエストを送信して、レスポンスコンテンツを取得します。
response = requests.get('http://www.aliyun.com')
# オブジェクトをアップロードするリクエストを実行します。バケット名、オブジェクト名、データコンテンツを指定します。
result = client.put_object(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
body=response.content,
))
# リクエスト結果のステータスコード、リクエスト ID、Content-MD5、ETag、CRC64 ハッシュ、バージョン ID を出力して、リクエストが成功したかどうかを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main() # スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。
ファイルのアップロードとコールバックの設定
次のサンプルコードは、ファイルがアップロードされた後にアプリケーションサーバーに通知する方法を示しています。
import base64
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="put object sample")
# 必須パラメーターを追加します。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--call_back_url', help='Callback server address.', required=True)
def main():
args = parser.parse_args()
# 環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK クライアントを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# OSS クライアントを作成します。
client = oss.Client(cfg)
# アップロードするコンテンツ (文字列)。
data = 'hello world'
# コールバックパラメーター (callback) を構築します。Webhook アドレスとコールバックリクエストボディを指定し、Base64 エンコーディングを使用します。
callback=base64.b64encode(str('{\"callbackUrl\":\"' + args.call_back_url + '\",\"callbackBody\":\"bucket=${bucket}&object=${object}&my_var_1=${x:var1}&my_var_2=${x:var2}\"}').encode()).decode()
# カスタム変数 (callback-var) を構築し、Base64 エンコーディングを使用します。
callback_var=base64.b64encode('{\"x:var1\":\"value1\",\"x:var2\":\"value2\"}'.encode()).decode()
# コールバックパラメーターを含むアップロードリクエストを開始します。
result = client.put_object(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
body=data,
callback=callback,
callback_var=callback_var,
))
# ステータスコードとリクエスト ID を含む、返された結果を出力します。
print(vars(result))
if __name__ == "__main__":
main()
ファイルのアップロードとプログレスバーの表示
次のサンプルコードは、プログレスバーを使用してローカルファイルのアップロードの進行状況を表示する方法を示しています。
import argparse
import alibabacloud_oss_v2 as oss
# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# バケットが配置されているリージョンを指定する --region コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS へのアクセスに使用できるドメイン名を指定する --endpoint コマンドライン引数を追加します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key コマンドライン引数を追加します。この引数は必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
args = parser.parse_args() # コマンドライン引数を解析します。
# ID 検証のために環境変数から認証情報を読み込みます。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト設定を読み込み、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 設定にリージョンを設定します。
cfg.region = args.region
# endpoint 引数が指定されている場合は、設定にエンドポイントを設定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 指定された設定を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# アップロードの進行状況を保存するために、progress_state という名前の辞書変数を定義します。初期値は 0 です。
progress_state = {'saved': 0}
def _progress_fn(n, written, total):
# グローバル変数の使用を避けるために、書き込まれたバイトの累積数を辞書に格納します。
progress_state['saved'] += n
# 現在のアップロード率を計算します。書き込まれたバイト数を総バイト数で割り、結果を切り捨てます。
rate = int(100 * (float(written) / float(total)))
# 現在のアップロードの進行状況を出力します。\r は行頭に戻ることを示し、コマンドラインでのリアルタイム更新を実装します。
# end='' は改行を追加しないことを示し、次の出力が現在の行を上書きするようにします。
print(f'\rUpload progress: {rate}% ', end='')
# オブジェクトをアップロードするリクエストを実行します。バケット名、オブジェクト名、データコンテンツを指定します。
result = client.put_object_from_file(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
progress_fn=_progress_fn,
),
"/local/dir/example", # ローカルファイルのパスを指定します。
)
# リクエスト結果のステータスコード、リクエスト ID、Content-MD5、ETag、CRC64 ハッシュ、バージョン ID を出力して、リクエストが成功したかどうかを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main() # スクリプトのエントリポイント。ファイルが直接実行されると main 関数が呼び出されます。