このトピックでは、簡易アップロード、追加アップロード、およびマルチパートアップロードを使用して、バージョン付きバケットにオブジェクトをアップロードする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョン、エンドポイント、オープンポート」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
オブジェクトをアップロードするには、
oss:PutObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
簡易アップロード
バージョン管理が有効なバケットにオブジェクトをアップロードするリクエストを開始すると、アップロードされたオブジェクトに対して一意のバージョンIDが生成され、そのバージョンIDがx-OSS-version-idヘッダーの値としてレスポンスに含まれます。 バージョン管理が一時停止されたバケットにオブジェクトをアップロードすると、OSSはオブジェクトのバージョンID nullを生成します。 アップロードしたオブジェクトの名前が既存のオブジェクトと同じ場合、既存のオブジェクトはアップロードしたオブジェクトによって上書きされます。 このように、各オブジェクトは、バージョンIDがnullであるバージョンのみを有する。
次のサンプルコードは、単純アップロードを使用してバージョン管理が有効なバケットにオブジェクトをアップロードする方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Upload the object.
result = bucket.put_object('yourObjectName', 'content of object')
# Display the returned HTTP status code.
print('http response code: {0}'.format(result.status))
# Display the version ID of the uploaded object.
print('put object version:', result.versionid)
追加アップロード
バージョン管理が有効なバケットでは、AppendObject操作は、現在のバージョンの追加可能オブジェクトに対してのみ実行できます。
現在のバージョンの追加可能オブジェクトに対してAppendObject操作を実行すると、そのオブジェクトの以前のバージョンは生成されません。
現在のバージョンが追加可能オブジェクトであるオブジェクトに対してPutObjectまたはDeleteObject操作を実行すると、OSSは追加可能オブジェクトを以前のバージョンとして保存し、オブジェクトがそれ以上追加されないようにします。
通常のオブジェクトや削除マーカーなど、現在のバージョンが追加できないオブジェクトでは、AppendObject操作を実行できません。
次のサンプルコードは、追加アップロードを使用してオブジェクトをアップロードする方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Set the position from which the first append operation starts to 0.
result = bucket.append_object('yourObjectName', 0, 'content of first append')
# Display the version ID of the object that is appended.
print('append object versionid:', result.versionid)
# If you have appended content to the object, you can obtain the position from which the operation starts this time from the next_position field in the response returned by the last operation or by using the bucket.head_object method.
bucket.append_object('yourObjectName', result.next_position, 'content of second append')
マルチパートアップロード
CompleteMultipartUpload操作を呼び出して、バージョン管理が有効なバケット内のオブジェクトのマルチパートアップロードタスクを完了すると、OSSはオブジェクトの一意のバージョンIDを生成し、レスポンスのx-oss-version-IDヘッダーの値としてバージョン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
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
key = 'yourObjectName'
filename = 'yourLocalFile'
total_size = os.path.getsize(filename)
# Specify the determine_part_size method to determine the part size.
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# Initiate a multipart upload task.
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []
# Upload the parts.
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# The SizedFileAdapter(fileobj, size) method generates a new object and recalculates the position from which the append operation starts.
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
# Complete the multipart upload task.
result = bucket.complete_multipart_upload(key, upload_id, parts)
# Display the version ID of the uploaded object, which is returned in the response.
print('result.versionid:', result.versionid)
# Verify the result of the multipart upload task.
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()
関連ドキュメント
シンプルアップロードを実行するために呼び出すことができるAPI操作の詳細については、「PutObject」をご参照ください。
追加アップロードを実行するために呼び出すことができるAPI操作の詳細については、「AppendObject」をご参照ください。
マルチパートアップロードを完了するために呼び出すことができるAPI操作の詳細については、「CompleteMultipartUpload」をご参照ください。