最近更新时间: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。
纯净模式