このトピックでは、シンプルアップロード、追加アップロード、またはマルチパートアップロードを使用して、バージョン管理が有効なバケットにオブジェクトをアップロードする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「OSS SDK for Python 1.0 を使用したアクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
ファイルをアップロードするには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。
シンプルアップロード
バージョン管理が有効なバケットでは、OSS は新しく追加された各オブジェクトに対して一意のバージョン ID を自動的に生成し、その ID を x-oss-version-id レスポンスヘッダーで返します。バージョン管理が一時停止されているバケットでは、新しく追加されたオブジェクトのバージョン ID は "null" になります。同じ名前のオブジェクトをアップロードすると、新しいオブジェクトが以前のオブジェクトを上書きします。OSS では、"null" のバージョン ID を持つことができるオブジェクトのバージョンは 1 つだけです。
次のコードは、シンプルアップロードを実行する方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントが配置されているリージョン (cn-hangzhou など) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# ファイルをアップロードします。
result = bucket.put_object('yourObjectName', 'content of object')
# HTTP ステータスコード。
print('http response code: {0}'.format(result.status))
# アップロードされたオブジェクトのバージョン ID を表示します。
print('put object version:', result.versionid)追加アップロード
バージョン管理が有効なバケットでは、追加操作 (AppendObject) は追加可能なオブジェクトの現在のバージョンに対してのみ実行できます。追加可能なオブジェクトの以前のバージョンに対して AppendObject 操作を実行することはできません。
追加可能なオブジェクトの現在のバージョンに対して AppendObject 操作を実行しても、OSS はそのオブジェクトの以前のバージョンを作成しません。
追加可能なオブジェクトの現在のバージョンに対して PutObject または DeleteObject 操作を実行すると、OSS は現在のバージョンを以前のバージョンとして保存します。このオブジェクトにデータを追加することはできなくなります。
通常のオブジェクトや削除マーカーなど、追加不可能なオブジェクトの現在のバージョンに対して AppendObject 操作を実行することはできません。
次のコードは、追加アップロードを実行する方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントが配置されているリージョン (cn-hangzhou など) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 最初のアップロードでは、追加位置 (Position パラメーター) を 0 に設定します。
result = bucket.append_object('yourObjectName', 0, 'content of first append')
# データが追加されたオブジェクトのバージョン ID を表示します。
print('append object versionid:', result.versionid)
# これが最初の追加操作でない場合は、bucket.head_object メソッドまたは以前の追加操作の戻り値の next_position プロパティから追加位置を取得できます。
bucket.append_object('yourObjectName', result.next_position, 'content of second append')マルチパートアップロード
バージョン管理が有効なバケットでは、CompleteMultipartUpload API 操作を呼び出してマルチパートアップロードを完了すると、OSS はオブジェクト全体に対して一意のバージョン ID を生成し、その ID を x-oss-version-id レスポンスヘッダーで返します。
次のコードは、マルチパートアップロードを実行する方法を示しています。
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントが配置されているリージョン (cn-hangzhou など) を指定します。注意:このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# yourBucketName をバケットの名前に設定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
key = 'yourObjectName'
filename = 'yourLocalFile'
total_size = os.path.getsize(filename)
# determine_part_size メソッドは、パートサイズを決定するために使用されます。
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# マルチパートアップロードを初期化します。
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []
# パートを 1 つずつアップロードします。
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# SizedFileAdapter(fileobj, size) メソッドは、新しいファイルオブジェクトを生成し、データを追加するための開始位置を再計算します。
result = bucket.upload_part(key, upload_id, part_number,
SizedFileAdapter(fileobj, num_to_upload))
parts.append(PartInfo(part_number, result.etag))
offset += num_to_upload
part_number += 1
# マルチパートアップロードを完了します。
result = bucket.complete_multipart_upload(key, upload_id, parts)
# 応答でアップロードされたファイルの versionid を表示します。
print('result.versionid:', result.versionid)
# マルチパートアップロードを検証します。
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()関連ドキュメント
シンプルアップロードの API 操作の詳細については、「PutObject」をご参照ください。
追加アップロードの API 操作の詳細については、「AppendObject」をご参照ください。
マルチパートアップロードの API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。