分块上传

最近更新时间:2021-10-12 15:26:18

分块上传完整示例

以下通过一个完整的示例对分块上传的流程进行逐步解析:

import math, os
from ks3.connection import Connection
from filechunkio import FileChunkIO

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。host(Endpoint) 以北京为例,其它 Region 请按实际情况填写。
conn = Connection('<yourAccessKeyId>', '<yourAccessKeySecret>', host='ks3-cn-beijing.ksyuncs.com')

# 获取存储空间实例
b = conn.get_bucket('<yourBucketName>')

# 源文件路径
source_path = '<yourSourceFilePath>'

# 源文件大小
source_size = os.stat(source_path).st_size

# 初始化分块。获取初始化的 uploadId,之后的操作中将会用到
# 如需在初始化分块时设置文件存储类型,请在 initiate_multipart_upload 中设置相关 headers
# x-kss-storage-class有效值为"STANDARD"、"STANDARD_IA"。"STANDARD"表示标准存储,"STANDARD_IA"表示低频存储,如果不指定,默认为标准存储。
headers = {"x-kss-storage-class": "STANDARD"}
mp = b.initiate_multipart_upload('<yourKeyName>', headers=headers)

# 举例以 50 MiB 为分块大小
chunk_size = 52428800
chunk_count = int(math.ceil(source_size*1.0 / chunk_size*1.0))

# 通过 FileChunkIO 将文件分块
for i in range(chunk_count):
    offset = chunk_size * i
    bytes = min(chunk_size, source_size - offset)
    with FileChunkIO(source_path, 'r', offset=offset, bytes=bytes) as fp:
	# 逐个上传分块
	mp.upload_part_from_file(fp, part_num=i + 1)

# 发送请求,合并分块,完成分块上传
ret = mp.complete_upload()
if ret and ret.status == 200:
    print("上传成功")

有关分块上传的更多详情,请参见Initiate Multipart Upload以及Complete Multipart Upload

取消分块上传事件

以下代码用于取消分块上传事件:

from ks3.connection import Connection

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。host(Endpoint) 以北京为例,其它 Region 请按实际情况填写。
conn = Connection('<yourAccessKeyId>', '<yourAccessKeySecret>', host='ks3-cn-beijing.ksyuncs.com')

# 获取存储空间实例
b = conn.get_bucket('<yourBucketName>')

# 取消指定upload_id的分块上传事件,已上传的分块会被删除。
# 列出 Bucket 内所有正在进行的分块上传任务
for p in b.get_all_multipart_uploads():
    print(p.id)
    # 取消上传
    print(p.cancel_upload())

取消分块上传事件的更多详情,请参见Abort Multipart Upload

列举已上传的分块信息

以下代码用于列举已上传的分块信息:

from ks3.connection import Connection

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。host(Endpoint) 以北京为例,其它 Region 请按实际情况填写。
conn = Connection('<yourAccessKeyId>', '<yourAccessKeySecret>', host='ks3-cn-beijing.ksyuncs.com')

# 获取存储空间实例
b = conn.get_bucket('<yourBucketName>')

# 初始化分块。获取初始化的 uploadId,之后的操作中将会用到
# 如需在初始化分块时设置文件存储类型,请在 initiate_multipart_upload 中设置相关 headers
# x-kss-storage-class有效值为"STANDARD"、"STANDARD_IA"。"STANDARD"表示标准存储,"STANDARD_IA"表示低频存储,如果不指定,默认为标准存储。
headers = {"x-kss-storage-class": "STANDARD"}
mp = b.initiate_multipart_upload('<yourKeyName>', headers=headers)

# 列出指定上传任务中所有已上传的分块信息
# part_number_marker 指定应该从哪个分块开始列举,只有比设定值大的分块才会被列举
for p in mp.get_all_parts(part_number_marker=2):
	print('part_number:%s' % p.part_number)

列举已上传分块的更多详情,请参见List Parts

列举分块上传事件

以下代码用于列举存储空间下的所有分块上传事件:

from ks3.connection import Connection

# 金山云主账号 AccessKey 拥有所有API的访问权限,风险很高。
# 强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
# 通过指定 host(Endpoint),您可以在指定的地域创建新的存储空间。host(Endpoint) 以北京为例,其它 Region 请按实际情况填写。
conn = Connection('<yourAccessKeyId>', '<yourAccessKeySecret>', host='ks3-cn-beijing.ksyuncs.com')

# 获取存储空间实例
b = conn.get_bucket('<yourBucketName>')

# 列举 Bucket 中所有的分块上传事件
key_marker='<yourKey>'
for p in b.list_multipart_uploads(key_marker=key_marker):
    print('uploadId:%s,key:%s' % (p.id, p.key_name))
    for i in p:
	print(i.part_number, i.size, i.etag, i.last_modified)

文档内容是否对您有帮助?

根本没帮助
文档较差
文档一般
文档不错
文档很好

在文档使用中是否遇到以下问题

内容不全,不深入
内容更新不及时
描述不清晰,比较混乱
系统或功能太复杂,缺乏足够的引导
内容冗长

更多建议

0/200

评价建议不能为空

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

问题反馈