クライアントとサーバー間でデータが転送されるときにエラーが発生することがあります。 Object Storage Service (OSS) は、提供されているいずれかのメソッドでアップロードされたオブジェクトのCRC-64値を返します。 クライアントは、CRC-64値をローカルマシンで計算されたCRC-64値と比較して、データの整合性を検証します。
背景情報
OSSは、ECMA-182標準に基づいてアップロードされたオブジェクトのCRC-64値を計算し、CRC-64値をオブジェクトのメタデータ項目として含め、CRC-64値をx-oss-hash-crc64ecma
ヘッダーとしてレスポンスに返します。
CRC-64のチェックサムがサポートされる前にオブジェクトがすでにOSSにアップロードされている場合、OSSはオブジェクトのCRC-64値を計算しません。 オブジェクトを要求すると、応答にCRC-64値は含まれません。
使用上の注意
PutObject、AppendObject、PostObject、およびMultipartUploadPart操作は、対応するCRC-64値を返します。 クライアントは、アップロードが完了した後にサーバーによって返されたCRC-64値を取得し、ローカルマシンで計算された値と照合することができます。
MultipartComplete操作が呼び出されると、各部分にCRC-64値がある場合、オブジェクト全体のCRC-64値が返されます。 いずれかの部品にCRC-64値がない場合、OSSは最終オブジェクトのCRC-64値を返しません。 たとえば、CRC-64のチェックサムがサポートされる前に部品がアップロードされた場合、その部品および最終オブジェクトのCRC-64値は返されません。
GetObject、HeadObject、およびGetObjectMeta操作は、対応するCRC-64値 (存在する場合) を返します。 GetObject操作が完了すると、クライアントはサーバーから返されたCRC-64値を取得し、ローカルマシンで計算された値と照合します。
説明Rangeヘッダーを含むGETリクエストは、オブジェクト全体のCRC-64値を返します。
CopyObjectやUploadPartCopyなどのコピー操作から生成された宛先オブジェクトには、CRC-64値がない場合があります。
例
Pythonの次のサンプルコードは、CRC-64値を使用してデータの整合性を検証する方法の例を示しています。
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
crcmodのインポート
ランダムにインポート
インポート文字列
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')
# CRC-64検証関数を作成します。
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693、initCrc=0、xorOut=0xffffffffffff、rev=True)
# CRC-64値を確認し、結果を表示します。
def check_crc64(local_crc64, oss_crc64, msg="check crc64"):
if local_crc64! =oss_crc64:
print("{0} チェックcrc64に失敗しました。 local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64))
Falseを返す
else:
print("{0} check crc64 ok.".format(msg))
真を返す
# 指定した長さのランダムな文字列を生成します。
def random_string(length):
return ''.join (range(length) 内のiに対するrandom.choice(string.ascii_lowercase))
# 長さ1024のランダムな文字列を生成します。
content = random_string(1024)
# オブジェクトのパスを指定します。
key = 'normal-key'
# GetObject操作のデータ整合性を確認します。
result = bucket.put_object (キー、コンテンツ)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(content)))
check_crc64(local_crc64, oss_crc64, "put object")
# GetObject操作のデータ整合性を確認します。
result = bucket.get_object (キー)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(result.resp.read()))
check_crc64(local_crc64, oss_crc64, "get object")
# 部品と最終オブジェクトのデータ整合性を確認します。
part_info_list = []
key = "multipart-key"
result = bucket.init_multipart_upload (キー)
upload_id = result.upload_id
part_1 = random_string(1024*1024)
result = bucket.upload_part(key, upload_id, 1, part_1)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_1)))
# パート1の整合性を確認します。
check_crc64(local_crc64、oss_crc64、"upload_partオブジェクト1")
part_info_list.append(PartInfo(1, result.etag, len(part_1)))
part_2 = random_string(1024*1024)
result = bucket.upload_part(key, upload_id, 2, part_2)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2)))
# パート2の整合性を確認します。
check_crc64(local_crc64、oss_crc64、"upload_partオブジェクト2")
part_info_list.append(PartInfo(2, result.etag, len(part_2)))
result = bucket.com plete_multipart_upload(key, upload_id, part_info_list)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma ', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2), do_crc64(oss2.to_bytes(part_1))))
# OSSにアップロードされた最終オブジェクトがローカルファイルと同じかどうかを確認します。
check_crc64(local_crc64, oss_crc64, "complete object")
サポートされているOSS SDK
次の表に、ダウンロードとアップロードのCRC-64をサポートするOSS SDKを示します。
SDK | CRCサポート | 例 |
OSS SDK for Java | 必須 | |
Python用OSS SDK | 必須 | |
OSS SDK for PHP | ✕ | なし |
OSS SDK for C# | ✕ | なし |
OSS SDK for C | 必須 | |
JavaScript用OSS SDK | ✕ | なし |
OSS SDK for Go | 必須 | |
Ruby用OSS SDK | ✕ | なし |
iOS用OSS SDK | 必須 | |
Android用OSS SDK | 必須 |