Object Storage Service (OSS) SDK for Javaは、MD5の検証とCRC-64を使用して、オブジェクトのアップロード、ダウンロード、コピー時にデータの整合性を確保します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
MD5検証
オブジェクトのアップロード要求でContent-MD5を設定すると、アップロードされたオブジェクトのMD5ハッシュが計算されます。 計算されたMD5ハッシュがアップロード要求で設定されたMD5ハッシュと異なる場合、InvalidDigestが返されます。 これにより、OSSはオブジェクトのアップロードのデータ整合性を確保できます。 InvalidDigestが返された場合は、オブジェクトを再度アップロードする必要があります。
次のサンプルコードは、PutObject操作でMD5検証を設定する方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルのフルパスを指定します。 アップロード中に、この変数の値がOSSにアップロードされます。 この値は、テキスト、画像、ビデオ、オーディオなど、任意の形式にすることができます。
ファイルとしてオープン ('/Users/test/Desktop/demo.txt' 、'rb') を持つ:
content = file.read()
# 実際のコンテンツに基づいて値のMD5ハッシュを計算します。
content_md5 = oss2.utils.content_md5 (コンテンツ);
プリント ('content_md5', content_md5)
# アップロードリクエストにContent-MD5ヘッダーを含めます。 サーバーは、アップロードされたコンテンツのMD5ハッシュを検証して、アップロードされたコンテンツの完全性と有効性を保証します。
headers = dict()
ヘッダー ['Content-MD5'] = content_md5
bucket.put_object(object_name, content, headers=headers)
MD5検証は、put_object、append_object、post_object、およびupload_part操作に使用できます。
CRC-64
データの検証CRC-64を実行するときは、次の項目に注意してください。
CRC-64は、put_object、get_object、append_object、およびupload_part操作に使用できます。 デフォルトでは、オブジェクトをアップロードするとCRC-64が有効になります。 クライアントで計算されたCRC-64値がOSSサーバーから返されたCRC-64値と異なる場合、InconsistentErrorが返されます。
CRC-64は範囲ダウンロードではサポートされていません。
CRC-64はCPUリソースを消費し、アップロードとダウンロードを遅くします。
オブジェクトのダウンロードのCRC-64
次のコードは、オブジェクトをダウンロードするときにCRC-64を実行する方法の例を示しています。
# -*-コーディング: utf-8 -*- oss2のインポート oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 # バケットの名前を指定します。 例: examplebucket. bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket') # オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 object_name = 'yourObjectName' # デフォルトでCRC-64が有効になっているかどうかを確認します。 print('bucket.enable-crc:', bucket.enable_crc) # bucket.get_objectによって返される値は、繰り返し処理できるファイルのようなオブジェクトです。 object_stream = bucket.get_object(object_name) プリント (object_stream.read()) # オブジェクトのCRC-64チェックサムを計算する前に、get_objectによって返されるストリームからオブジェクトを読み取るには、read() を呼び出す必要があります。 object_stream.client_crcの場合! =object_stream.server_crc: 印刷 (「クライアントとサーバー間のCRCチェックサムに矛盾があります! 」)
追加アップロードのCRC-64
追加アップロードでinit_crcを指定すると、CRC-64はデフォルトで有効になります。
# -*-コーディング: utf-8 -*- oss2のインポート oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 # バケットの名前を指定します。 例: examplebucket. bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket') object_name = "yourAppendObjectName" first_content = "yourFirstContent" second_content = "yourSecondContent" # 最初の追加アップロードでinit_crcを指定します。 # init_crcが指定されている場合、OSS SDKは返された結果のCRC-64を実行します。 result = bucket.append_object(object_name, 0, first_content, init_crc=0) #2番目の追加アップロードでinit_crcを指定します。 # init_crcをアップロードされたオブジェクトのCRC-64値に設定します。 result = bucket.append_object(object_name, result.next_position, second_content, init_crc=result.crc)
参考資料
MD5の検証とCRC-64に使用される完全なサンプルコードについては、GitHubをご覧ください。