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

Object Storage Service:オブジェクトのアップロード

最終更新日:Feb 26, 2024

このトピックでは、簡易アップロード、追加アップロード、およびマルチパートアップロードを使用して、バージョン付きバケットにオブジェクトをアップロードする方法について説明します。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 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であるバージョンのみを有する。

次のサンプルコードは、単純アップロードを使用してバージョン管理が有効なバケットにオブジェクトをアップロードする方法の例を示しています。

# -*-コーディング: 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')

# オブジェクトをアップロードします。 
result = bucket.put_object('yourObjectName', 'content of object')
# 返されたHTTPステータスコードを表示します。 
print('httpレスポンスコード: {0}'.format(result.status))
# アップロードされたオブジェクトのバージョンIDを表示します。 
print('put object version:', result.versionid) 

追加アップロード

バージョン管理が有効なバケットでは、AppendObject操作は、現在のバージョンの追加可能オブジェクトに対してのみ実行できます。

説明
  • 現在のバージョンの追加可能オブジェクトに対してAppendObject操作を実行すると、そのオブジェクトの以前のバージョンは生成されません。

  • 現在のバージョンが追加可能オブジェクトであるオブジェクトに対してPutObjectまたはDeleteObject操作を実行すると、OSSは追加可能オブジェクトを以前のバージョンとして保存し、オブジェクトがそれ以上追加されないようにします。

  • 通常のオブジェクトや削除マーカーなど、現在のバージョンが追加できないオブジェクトでは、AppendObject操作を実行できません。

次のサンプルコードは、追加アップロードを使用してオブジェクトをアップロードする方法の例を示しています。

# -*-コーディング: 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')

# 最初の追加操作の開始位置を0に設定します。 
result = bucket.append_object('yourObjectName', 0, 'content of first append')
# 追加されたオブジェクトのバージョンIDを表示します。 
print('append object versionid:', result.versionid)
# オブジェクトにコンテンツを追加した場合は、前回の操作で返された応答のnext_positionフィールドから、またはbucket.head_objectメソッドを使用して、今回操作を開始する位置を取得できます。 
bucket.append_object('yourObjectName', result.next_position, 'content of second append') 

マルチパートアップロード

CompleteMultipartUpload操作を呼び出して、バージョン管理が有効なバケット内のオブジェクトのマルチパートアップロードタスクを完了すると、OSSはオブジェクトの一意のバージョンIDを生成し、レスポンスのx-oss-version-IDヘッダーの値としてバージョンidを返します。

次のサンプルコードは、マルチパートアップロードを使用してバージョン管理が有効なバケットにオブジェクトをアップロードする方法の例を示しています。

# -*-コーディング: utf-8 -*-
osのインポート
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2インポートSizedFileAdapterから、determine_part_size
oss2.modelsからPartInfoをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、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)

# マルチパートアップロードタスクを開始します。 
upload_id = bucket.init_multipart_upload(key).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

# マルチパートアップロードタスクを完了します。 
result = bucket.com plete_multipart_upload(key, upload_id, parts)
# アップロードされたオブジェクトのバージョンIDを表示します。これはレスポンスで返されます。
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」をご参照ください。