すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:同じ名前のオブジェクトの上書きを防止する

最終更新日:Feb 21, 2024

既定では、既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、既存のオブジェクトはアップロードされたオブジェクトによって上書きされます。 このトピックでは、x-oss-forbid-overwriteリクエストヘッダーを設定して、オブジェクトをコピーするとき、または単純なアップロードまたはマルチパートアップロードを実行するときに、既存のオブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法について説明します。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

単純なアップロードタスクでの上書きの防止

次のサンプルコードは、単純なアップロードを実行するときに、既存のオブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法の例を示しています。

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsから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')

# オブジェクトをアップロードします。 
# 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'])) 

オブジェクトコピータスクでの上書きの防止

  • 小さなオブジェクトをコピーする

    次のサンプルコードでは、同じ名前の既存のオブジェクトを上書きせずに小さなオブジェクトをコピーする方法の例を示します。

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    oss2.credentialsから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) 
  • 大きなオブジェクトをコピーする

    次のサンプルコードは、マルチパートコピーを使用してラージオブジェクトをコピーするときに、既存のオブジェクトが同じ名前のラージオブジェクトによって上書きされないようにする方法の例を示しています。

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
    oss2.modelsからPartInfoをインポート
    oss2 import determine_part_sizeから
    # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、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')
    
    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
    オフセット=0
    オフセット <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.com plete_multipart_upload(dst_object, upload_id, parts, headers=headers) 

マルチパートアップロードタスクでの上書きの防止

次のサンプルコードは、マルチパートアップロードを使用してオブジェクトをアップロードするときに、既存のオブジェクトが同じ名前のオブジェクトによって上書きされないようにする方法の例を示しています。

# -*-コーディング: utf-8 -*-
osのインポート
oss2インポートSizedFileAdapterから、determine_part_size
oss2.modelsからPartInfoをインポート
oss2のインポート
oss2.credentialsから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')

key = 'yourObjectName'
filename = 'yourLocalFile'

total_size = os.path.getsize (ファイル名)
# 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 (キー、ヘッダー=ヘッダー) 。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.com plete_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」をご参照ください。