分片上传和断点续传

使用说明

  • 将要上传的文件分成多个数据块(US3 里又称之为 Part)来分别上传,上传完成之后再调将这些 Part 组合成一个 Object 来达到断点续传的效果。
  • 适用场景
    1. 大文件(大于1GB)的上传。
    2. 恶劣的网络环境:如果上传的过程中出现了网络错误,可以从失败的Part进行续传。其他上传方式则需要从文件起始位置上传。

函数说明

uploadfile

uploadfile(bucket, key, localfile, maxthread=4, retrycount=3, retryinterval=5, header=None)

​ 分片上传本地文件到空间

Parameters

  • bucket – string类型,空间名称
  • key – string类型,文件在空间中的名称
  • localfile – string 类型,本地文件名称
  • maxthread – 限制的最大线程数
  • retrycount – integer 类型,分片重传次数
  • retryinterval – integer 类型,同个分片失败重传间隔,单位秒
  • header – dict类型,http 请求header,键值对类型分别为string,比如{'User-Agent': 'Google Chrome'}

Returns

  • ret: 如果http状态码为[200, 204, 206]之一则返回None,否则如果服务器返回json信息则返回dict类型,键值对类型分别为string, unicode string类型,否则返回空的dict
  • ResponseInfo: 响应的具体信息,UCloud UFile 服务器返回信息或者网络链接异常

resumeuploadfile

resumeuploadfile(retrycount=3, retryinterval=5, bucket=None, key=None, uploadid=None, blocksize=None, etaglist=None, localfile=None, pausepartnumber=None, mime_type=None, header=None)

​ 断点续传失败的本地文件分片。可以在调用uploadfile失败后重新续传,也可以通过传递所有需要的参数续传。

Parameters

  • retrycount – integer 类型,分片重传次数
  • retryinterval – integer 类型,同个分片失败重传间隔,单位秒
  • bucket – string类型, 空间名称
  • key – string类型,文件或数据在空间中的名称
  • uploadid – string类型,初始化分片获得的uploadid
  • blocksize – integer类型,分片大小
  • etaglist – list类型,元素为已经上传成功的分片的etag
  • pausepartnumber – integer类型,第一个失败分片的编号(编号从0开始)
  • localfile – string类型,本地文件名称
  • mime_type – string类型,上传数据的MIME类型
  • header – dict类型,http 请求header,键值对类型分别为string,比如{'User-Agent': 'Google Chrome'}

Returns

  • ret: 如果http状态码为[200, 204, 206]之一则返回None,否则如果服务器返回json信息则返回dict类型,键值对类型分别为string, unicode string类型,否则返回空的dict
  • ResponseInfo: 响应的具体信息,UCloud UFile 服务器返回信息或者网络链接异常

uploadstream

uploadstream(bucket, key, stream, maxthread=4, retrycount=3, retryinterval=5, mime_type=None, header=None)

​ 断点续传失败数据流的分片。可以在调用uploadstream失败后重新续传,也可以通过传递所有需要的参数续传

Parameters

  • bucket – 空间名称
  • key – 上传数据在空间中的名称
  • stream – file-like 对象或者二进制数据流
  • maxthread – 限制的最大线程数
  • mime_type – 上传数据的MIME类型
  • retrycount – integer 类型,分片重传次数
  • retryinterval – integer 类型,同个分片失败重传间隔,单位秒
  • header – dict类型,http 请求header,键值对类型分别为string,比如{'User-Agent': 'Google Chrome'}

Returns

  • ret: 如果http状态码为[200, 204, 206]之一则返回None,否则如果服务器返回json信息则返回dict类型,键值对类型分别为string, unicode string类型,否则返回空的dict
  • ResponseInfo: 响应的具体信息,UCloud UFile 服务器返回信息或者网络链接异常

resumeuploadstream

resumeuploadstream(retrycount=3, retryinterval=5, bucket=None, key=None, uploadid=None, blocksize=None, etaglist=None, stream=None, pausepartnumber=None, mime_type=None, header=None)

​ 分片上传二进制数据流到UFile空间。

Parameters

  • retrycount – integer 类型,分片重传次数
  • retryinterval – integer 类型,同个分片失败重传间隔,单位秒
  • bucket – string类型, 空间名称
  • key – string类型,文件或数据在空间中的名称
  • uploadid – string类型,初始化分片获得的uploadid
  • blocksize – integer类型,分片大小
  • etaglist – list类型,元素为已经上传成功的分片的etag
  • pausepartnumber – integer类型,第一个失败分片的编号(编号从0开始)
  • stream – file-like对象或者二进制数据流,需要重新上传的数据
  • mime_type – string类型,上传数据的MIME类型
  • header – dict类型,http 请求header,键值对类型分别为string,比如{'User-Agent': 'Google Chrome'}

Returns

  • ret: 如果http状态码为[200, 204, 206]之一则返回None,否则如果服务器返回json信息则返回dict类型,键值对类型分别为string, unicode string类型,否则返回空的dict
  • ResponseInfo: 响应的具体信息,UCloud UFile 服务器返回信息或者网络链接异常

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public_key = ''         #账户公钥
private_key = ''        #账户私钥

bucket = ''             #空间名称
sharding_key = ''       #上传文件在空间中的名称
local_file = ''         #本地文件名

# 设置上传host后缀,外网可用后缀形如 .cn-bj.ufileos.com(cn-bj为北京地区,其他地区具体后缀可见控制台:对象存储-单地域空间管理-存储空间域名)
# 默认值为'.cn-bj.ufileos.com',如果上传文件的bucket所在地域不在北京,请务必设置此项
upload_suffix = 'YOUR_UPLOAD_SUFFIX'

from ufile import multipartuploadufile

multipartuploadufile_handler = multipartuploadufile.MultipartUploadUFile(public_key, private_key, upload_suffix)

# 分片上传一个全新的文件
ret, resp = multipartuploadufile_handler.uploadfile(bucket, sharding_key, local_file)
while True:
    if resp.status_code == 200:     # 分片上传成功
        break
    elif resp.status_code == -1:    # 网络连接问题,续传
        ret, resp = multipartuploadufile_handler.resumeuploadfile()
    else:                           # 服务或者客户端错误
        print(resp.error)
        break

# 分片上传一个全新的二进制数据流
from io import BytesIO
bio = BytesIO(u'你好'.encode('utf-8'))
ret, resp = multipartuploadufile_handler.uploadstream(bucket, sharding_key, bio)
while True:
    if resp.status_code == 200:     # 分片上传成功
        break
    elif resp.status_code == -1:    # 网络连接问题,续传
        ret, resp = multipartuploadufile_handler.resumeuploadstream()
    else:                           # 服务器或者客户端错误
        print(resp.error)
        break
  • HTTP 返回状态码
状态码 描述
200 文件或者数据上传成功
400 上传到不存在的空间
403 API公私钥错误
401 上传凭证错误