数据在客户端和服务器之间传输时有可能会出错。OSS现在支持对各种方式上传的Object返回其crc64值,客户端可以和本地计算的crc64值做对比,从而完成数据完整性的验证。
背景信息
OSS对新上传的Object进行crc64的计算,并将结果作为Object的元信息存储,随后在返回的response header中增加x-oss-hash-crc64ecma
头部,表示其crc64值,该64位CRC根据ECMA-182标准计算得出。
对于crc64上线之前就已经存在于OSS上的Object,OSS不会对其计算crc64值,所以获取此类Object时不会返回其crc64值。
操作说明
- PutObject、AppendObject、PostObject、MultipartUploadPart均会返回对应的crc64值,客户端可以在上传完成后拿到服务器返回的crc64值和本地计算的数值进行校验。
- MultipartComplete时,如果所有的Part都有crc64值,则会返回整个Object的crc64值;若某些Part没有crc64值,则不返回整个Object的crc64值。例如某个Part在crc64上线之前就已经上传,则不返回crc64值。
- GetObject、HeadObject、GetObjectMeta都会返回对应的crc64值(如有)。客户端可以在GetObject完成后,拿到服务器返回的crc64值和本地计算的数值进行校验。
说明 range get请求返回的将会是整个Object的crc64值。
- Copy相关的操作,如CopyObject、UploadPartCopy,新生成的Object/Part不保证具有crc64值。
应用示例
以下为完整的Python示例代码,演示如何基于crc64值验证数据传输的完整性。
OSS SDK支持
部分OSS SDK已经支持上传、下载使用crc64进行数据校验,用法见下表中的示例。
SDK | 是否支持CRC | 示例 |
---|---|---|
Java SDK | 是 | CRCSample.java |
Python SDK | 是 | object_check.py |
PHP SDK | 否 | 无 |
C# SDK | 否 | 无 |
C SDK | 是 | oss_crc_sample.c |
JavaScript SDK | 否 | 无 |
Go SDK | 是 | crc_test.go |
Ruby SDK | 否 | 无 |
iOS SDK | 是 | OSSCrc64Tests.m |
Android SDK | 是 | CRC64Test.java |