デフォルトでは、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトはアップロードされたオブジェクトによって上書きされます。このトピックでは、オブジェクトのコピー、シンプルアップロード、またはマルチパートアップロードを実行するときに、同名のオブジェクトによって既存のオブジェクトが上書きされないように、x-oss-forbid-overwrite リクエストヘッダーを設定する方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントが使用されています。 OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。 OSS のリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。 アクセス認証情報を設定する方法の詳細については、「OSS SDK for Python 1.0 を使用してアクセス認証情報を設定する」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスが作成されます。 カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
シンプルアップロードタスクでの上書き防止
次のサンプルコードは、シンプルアップロードを実行するときに、同名のオブジェクトによって既存のオブジェクトが上書きされないようにする方法の例を示しています。
# -*- 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"
# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。
region = "cn-hangzhou"
# バケットの名前を指定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# オブジェクトをアップロードします。
# PutObject 操作によってアップロードされるオブジェクトが、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。
# デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を false に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を true に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きできません。バケットに同じ名前のオブジェクトが存在する場合、OSS はエラーを返します。
headers = {'x-oss-forbid-overwrite': 'true'}
result = bucket.put_object('yourObjectName', 'content of object', headers=headers)
# 返された HTTP ステータスコードを表示します。
print('http status: {0}'.format(result.status))
# リクエスト ID を表示します。リクエスト ID は、リクエストを一意に識別します。このパラメーターをログに追加することをお勧めします。
print('request_id: {0}'.format(result.request_id))
# put_object メソッドによって返された ETag 値を表示します。
print('ETag: {0}'.format(result.etag))
# HTTP 応答ヘッダーを表示します。
print('date: {0}'.format(result.headers['date']))オブジェクトコピータスクでの上書き防止
小さいオブジェクトをコピーする
次のサンプルコードは、同じ名前の既存のオブジェクトを上書きせずに小さいオブジェクトをコピーする方法の例を示しています。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID 環境変数と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 # バケットの名前を指定します。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName') # copy_object 操作によってコピーされるオブジェクトが、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 # デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、既存のオブジェクトは同じ名前のコピーされたオブジェクトによって上書きされます。 # x-oss-forbid-overwrite を false に設定すると、既存のオブジェクトは同じ名前のコピーされたオブジェクトによって上書きされます。 # x-oss-forbid-overwrite を true に設定すると、既存のオブジェクトは同じ名前のコピーされたオブジェクトによって上書きされません。既存のオブジェクトの名前がコピーされたオブジェクトと同じ名前の場合、エラーが報告されます。 headers = dict() headers = {'x-oss-forbid-overwrite':'true'} bucket.copy_object('yourSourceBucketName', 'yourSourceObjectName', 'yourDestinationObjectName', headers=headers)大きいオブジェクトをコピーする
次のサンプルコードは、マルチパートコピーを使用して大きいオブジェクトをコピーするときに、同じ名前の大きいオブジェクトによって既存のオブジェクトが上書きされないようにする方法の例を示しています。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from oss2.models import PartInfo from oss2 import determine_part_size # 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、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" # エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。 region = "cn-hangzhou" # バケットの名前を指定します。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) src_object = 'yourSourceObjectName' dst_object = 'yourDestinationObjectName' total_size = bucket.head_object(src_object).content_length part_size = determine_part_size(total_size, preferred_size=100 * 1024) # マルチパートアップロードタスクを開始します。 # オブジェクトをコピーするときに、同じ名前のオブジェクトを上書きするかどうかを指定します。 # デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、コピーされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。 # x-oss-forbid-overwrite を false に設定すると、コピーされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。 # x-oss-forbid-overwrite を true に設定すると、既存のオブジェクトは同じ名前のコピーされたオブジェクトによって上書きされません。既存のオブジェクトの名前がコピーされたオブジェクトと同じ名前の場合、エラーが報告されます。 headers = dict() headers = {'x-oss-forbid-overwrite': 'true'} upload_id = bucket.init_multipart_upload(dst_object, headers=headers).upload_id parts = [] # 各パートをコピーします。 part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) byte_range = (offset, offset + num_to_upload - 1) result = bucket.upload_part_copy(bucket.bucket_name, src_object, byte_range,dst_object, upload_id, part_number) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1 # マルチパートコピータスクを完了します。 # オブジェクトをコピーするときに、同じ名前のオブジェクトを上書きするかどうかを指定します。 # デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。 # x-oss-forbid-overwrite を false に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。 # x-oss-forbid-overwrite を true に設定すると、既存のオブジェクトは同じ名前のコピーされたオブジェクトによって上書きされません。既存のオブジェクトの名前がコピーされたオブジェクトと同じ名前の場合、エラーが報告されます。 headers = dict() headers = {'x-oss-forbid-overwrite':'true'} bucket.complete_multipart_upload(dst_object, upload_id, parts, headers=headers)
マルチパートアップロードタスクでの上書き防止
次のサンプルコードは、マルチパートアップロードを使用してオブジェクトをアップロードするときに、同じ名前のオブジェクトによって既存のオブジェクトが上書きされないようにする方法の例を示しています。
# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
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"
# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。
region = "cn-hangzhou"
# バケットの名前を指定します。
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)
# マルチパートアップロードタスクを開始します。
# マルチパートアップロードを実行するときに、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。
# デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を false に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を true に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きできません。バケットに同じ名前のオブジェクトが存在する場合、OSS はエラーを返します。
headers = {'x-oss-forbid-overwrite': 'true'}
upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id
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)
# 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
# マルチパートアップロードタスクを完了します。
# マルチパートアップロードを実行するときに、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。
# デフォルトでは、x-oss-forbid-overwrite が指定されていない場合、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を false に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きします。
# x-oss-forbid-overwrite を true に設定すると、アップロードされたオブジェクトは同じ名前の既存のオブジェクトを上書きできません。バケットに同じ名前のオブジェクトが存在する場合、OSS はエラーを返します。
headers = {'x-oss-forbid-overwrite': 'true'}
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)
# マルチパートアップロードタスクの結果を確認します。
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()関連情報
シンプルアップロードを実行するために呼び出すことができる API 操作の詳細については、「PutObject」をご参照ください。
オブジェクトをコピーするために呼び出すことができる API 操作の詳細については、「CopyObject」をご参照ください。
マルチパートアップロードを実行するために呼び出すことができる API 操作の詳細については、「InitiateMultipartUpload」および「CompleteMultipartUpload」をご参照ください。