OSS提供基于MD5和CRC64的数据校验,确保上传、下载和拷贝文件(Object)过程中的数据完整性。

MD5校验

如果上传文件时设置了Content-MD5,OSS会根据接收的内容计算MD5。OSS计算的MD5值和上传提供的MD5值不一致时,则返回InvalidDigest异常,从而保证数据的完整性。返回InvalidDigest异常后,您需要重新上传文件。

以下代码用于上传文件时进行MD5校验:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
object_name = '<yourObjectName>'
content = '<yourContent>'

# 计算上传内容的md5。
content_md5 = oss2.utils.content_md5(content);
print('content_md5', content_md5)

# 上传请求中携带'Content-MD5' header。服务器将会校验上传内容的md5。
headers = dict()
headers['Content-MD5'] = content_md5
bucket.put_object(object_name, content, headers=headers)
说明 put_object、append_Object、post_Object、upload_part均支持MD5校验。

CRC64校验

使用CRC校验数据时,有如下注意事项:

说明
  • put_object、get_object、append_object、upload_part支持CRC64校验。上传文件时默认开启CRC校验,如果客户端计算的CRC值与服务端返回的CRC值不一致, 则会抛出InconsistentError异常。
  • 范围下载不支持CRC64校验。
  • CRC64校验会占用一定的CPU,对上传、下载速度均会有影响。
  • 下载文件时CRC64校验

    以下代码用于下载文件时进行CRC64数据完整性校验:

    # -*- coding: utf-8 -*-
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    object_name = '<yourObjectName>'
    
    # 查看是否已默认开启crc校验。
    print('bucket.enable-crc:',  bucket.enable_crc)
    
    # bucket.get_object的返回值是一个类文件对象(File-Like Object),同时也是一个可迭代对象(Iterable)。
    object_stream = bucket.get_object(object_name)
    print(object_stream.read())
    
    # 由于get_object接口返回的是一个stream流,需要执行read()后才能计算出返回Object数据的CRC checksum,因此需要在调用该接口后做CRC校验。
    if object_stream.client_crc != object_stream.server_crc:
        print "The CRC checksum between client and server is inconsistent!"
  • 追加上传时CRC64校验

    追加上传时,如果指定了init_crc参数,则默认开启CRC64校验。

    # -*- coding: utf-8 -*-
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    
    object_name = "<yourAppendObjectName>"
    first_content = "<yourFirstContent>"
    second_content = "<yourSecondContent>"
    
    # 第一次追加上传。
    # 在指定了init_crc的情况下,SDK默认会对返回结果进行crc校验。
    result = bucket.append_object(object_name, 0, first_content, init_crc=0)
    
    # 第二次追加上传。
    # 指定init_crc为已上传数据的crc。
    result = bucket.append_object(object_name, result.next_position, second_content, init_crc=result.crc)