全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

数据校验(Python)

最近更新时间:2024-05-23 20:21:18

KS3支持CRC64数据校验,确保上传、下载过程中的数据完整性。

上传数据

以下代码用于上传数据时进行CRC64数据校验:

Python SDK 的版本V1.5.13开始支持crc校验开关参数enable_crc

from ks3.connection import Connection
from ks3 import utils
import os
import math

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号进行API访问或日常运维,请登录https://uc.console.ksyun.com/pro/iam/#/user/list创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。
c = Connection('<YOUR_ACCESS_KEY>', '<YOUR_SECRET_KEY>', host='YOUR_REGION_ENDPOINT')

# 获取存储空间实例。
b = c.get_bucket('<YOUR_BUCKET_NAME>')

# 默认开启自动校验CRC64
# 关闭需要 c.enable_crc = False 或 Connection(ak, sk, host=endpoint, enable_crc=False)
key_name = '<yourKeyName>'
file_path = '<your_file_path>'

# 所有上传操作自动校验CRC64,无需其他特殊操作
# 查看是否开启CRC64自动校验
print(c.enable_crc)
k = b.new_key(key_name)
ret = k.set_contents_from_filename(file_path)

# 如果不开启自动CRC64校验,支持手动计算CRC64后,以传入Header的方式在服务端进行比对
def uploadObjectFromFile_checkingCrc64ByHeader():
    k = b.new_key(key_name)
    c.enable_crc = False
    local_crc = utils.compute_file_crc64(file_path)
    crc_header = c.provider.checksum_crc64ecma_header
    k.set_contents_from_filename(file_path, headers={crc_header: local_crc})

def uploadObjectFromString_checkingCrc64ByHeader():
    k = b.new_key(key_name)
    myContent = 'some string'
    c.enable_crc = False
    local_crc = utils.compute_data_crc64(myContent)
    crc_header = c.provider.checksum_crc64ecma_header
    k.set_contents_from_string(myContent, headers={crc_header: local_crc})

def multi_upload_checkingCrc64ByHeader():
    from filechunkio import FileChunkIO
    # 服务端不比对文件整体CRC64,可以在本地比对
    c.enable_crc = False
    crc_header = c.provider.checksum_crc64ecma_header
    crc_obj = utils.Crc64(0)
    final_crc = 0

    source_size = os.stat(file_path).st_size

    mp = b.initiate_multipart_upload("test_multi")

    chunk_size = 100 * 1024
    count = int(math.ceil(source_size * 1.0 / chunk_size * 1.0))

    for i in range(count):
        offset = chunk_size * i
        read_size = min(chunk_size, source_size - offset)
        with FileChunkIO(file_path, 'r', offset=offset, bytes=read_size) as fp:
            # 计算单个分片的CRC64
            local_part_crc = utils.compute_file_crc64(file_path, offset, offset + read_size - 1)
            # 将每一个分片的CRC64合并,最终将得到文件整体的CRC64值
            final_crc = crc_obj.combine(final_crc, int(local_part_crc), read_size)
            # 逐个上传分片
            mp.upload_part_from_file(fp, part_num=i + 1, headers={crc_header: local_part_crc})
    ret = mp.complete_upload()

    print(ret.ChecksumCRC64ECMA == str(final_crc))

注:相关API请参见文档:PUT Object

下载数据

以下代码用于下载数据时进行CRC64数据校验:

Python SDK 的版本V1.5.13开始支持crc校验开关参数enable_crc

from ks3 import utils
from ks3.connection import Connection
import time

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号进行API访问或日常运维,请登录https://uc.console.ksyun.com/pro/iam/#/user/list创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。
c = Connection('<YOUR_ACCESS_KEY>', '<YOUR_SECRET_KEY>', host='YOUR_REGION_ENDPOINT')

# 获取存储空间实例。
b = c.get_bucket('<YOUR_BUCKET_NAME>')
k = b.get_key('<yourKeyName>')

# 下载数据
data = k.read(300)
while data:
    s = data.decode()
    print('bytes decoded:', s)
    time.sleep(5)
    data = k.read(300)
# 读完数据后进行CRC64比对
print(k.server_crc == k.client_crc)

# 下载数据到字符串
s = k.get_contents_as_string().decode()
# 手动计算后进行CRC64比对
client_crc = utils.compute_data_crc64(s)
print(client_crc == k.server_crc)

注:相关API请参见文档:GET Object

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈