文档首页/ 对象存储服务 OBS/ SDK参考/ Python/ 对象相关接口(Python SDK)/ 下载对象-断点续传下载(Python SDK)
更新时间:2024-11-13 GMT+08:00
分享

下载对象-断点续传下载(Python SDK)

功能说明

当下载大对象到本地文件时,经常出现因网络不稳定或程序崩溃导致下载失败的情况。失败后再次重新下载不仅浪费资源,而且当网络不稳定时仍然有下载失败的风险。断点续传下载接口能有效地解决此类问题引起的下载失败,其原理是将待下载的对象分成若干个分段分别下载,并实时地将每段下载结果统一记录在checkpoint文件中,仅当所有分段都下载成功时返回下载成功的结果,否则返回错误信息提醒用户再次调用接口进行重新下载(重新下载时因为有checkpoint文件记录当前的下载进度,避免重新下载所有分段,从而节省资源提高效率)。

接口约束

  • 您必须是桶拥有者或拥有下载对象的权限,才能下载对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略配置对象策略
  • OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点
  • 断点续传下载接口是利用范围下载特性实现的,是对范围下载的封装和加强。
  • 断点续传下载接口不仅能在失败重下时节省资源提高效率,还因其对分段进行并发下载的机制能加快下载速度,帮助用户快速完成下载业务;且其对用户透明,用户不用关心checkpoint文件的创建和删除、分段任务的切分、并发下载的实现等内部细节。
  • EnableCheckpoint参数默认是False,代表不启用断点续传模式,此时断点续传下载接口退化成对范围下载的简单封装,不会产生checkpoint文件。
  • CheckpointFile参数仅在EnableCheckpoint参数为True时有效。

方法定义

ObsClient.downloadFile(bucketName, objectKey, downloadFile, partSize, taskNum, enableCheckpoint, checkpointFile, header, versionId, progressCallback, extensionHeaders)

请求参数

表1 请求参数列表

参数名称

参数类型

是否必选

描述

bucketName

str

必选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

默认取值:

objectKey

str

必选

参数解释:

对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。

例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。

取值范围:

长度大于0且不超过1024的字符串。

默认取值:

downloadFile

str

必选

参数解释:

下载对象的本地文件全路径。

默认取值:

partSize

int

可选

参数解释:

分段大小。

取值范围:

大于0,小于对象大小,单位:字节。

默认取值:

5MB

taskNum

int

可选

参数解释:

分段下载时的最大并发数。

取值范围:

(0, 文件大小/分段大小],即大于0小于等于文件大小除以分段大小向上取整。

默认取值:

1,即不设置则默认串行下载。

enableCheckpoint

bool

可选

参数解释:

是否开启断点续传模式。

取值范围:

True:开启断点续传模式。

False:关闭断点续传模式。

默认取值:

False:关闭断点续传模式。

checkpointFile

str

可选

参数解释:

断点续传过程中,会生成一个进度记录文件,文件中会记录段的下载进度和段的相关信息。checkpointFile参数为该记录文件的文件路径。

约束限制:

仅在断点续传模式下有效。

默认取值:

当该值为空时,默认为当前目录。

header

GetObjectHeader

可选

参数解释:

下载对象的头域,用于获取对象的基本信息,包括存储类别、冗余策略等。

取值范围:

参考GetObjectHeader

默认取值:

versionId

str

可选

参数解释:

对象的版本号,用于获取指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。

取值范围:

长度为32的字符串。

默认取值:

无,如果不设置则默认获取最新版本的对象。

progressCallback

callable

可选

参数解释:

获取下载进度的回调函数。

默认取值:

说明:

该回调函数依次包含三个参数:已下载的字节数、总字节数、已使用的时间(单位:秒),示例代码参考下载对象-获取下载进度

extensionHeaders

dict

可选

参数解释:

接口的拓展头域。

取值范围:

参考自定义头域

默认取值:

表2 GetObjectHeader

参数名称

参数类型

是否必选

描述

range

str

可选

参数解释:

指定下载的范围。例如:0-999,即对象的第1个字节到1000字节。

取值范围:

取值区间:[0,对象长度-1],格式:x-y,即对象的第x+1字节到第y+1字节。

约束限制:

如果range的最大长度超出对象长度-1,仍旧取对象长度-1。

默认取值:

if_match

str

可选

参数解释:

指定一个预设的Etag值,如果下载对象的ETag值与该参数值相同,则返回对象内容,否则返回错误。

取值范围:

长度为32的字符串。

默认取值:

if_none_match

str

可选

参数解释:

指定一个预设的Etag值,如果下载对象的ETag值与该参数值不相同,则返回对象内容,否则返回错误。

取值范围:

长度为32的字符串。

默认取值:

if_modified_since

str

DateTime

可选

参数解释:

如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。

约束限制:

日期格式为GMT的格式。 例如:Wed, 25 Mar 2020 02:39:52 GMT。可以使用DateTime生成日期。

代码示例:DateTime(year=2023, month=9, day=12)。

默认取值:

if_unmodified_since

str

DateTime

可选

参数解释:

如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。

约束限制:

日期格式为GMT的格式。 例如:Wed, 25 Mar 2020 02:39:52 GMT。可以使用DateTime生成日期。

代码示例:DateTime(year=2023, month=9, day=12)。

默认取值:

origin

str

可选

参数解释:

预请求指定的跨域请求Origin(通常为域名)。

约束限制:

每个匹配规则允许使用最多一个“*”通配符。

默认取值:

requestHeaders

str

可选

参数解释:

跨域请求可以使用的HTTP头域。只有匹配上允许的头域中的配置,才被视为是合法的CORS请求。

约束限制:

每个头域可填写一个“*”通配符,不支持&、:、<、空格以及中文字符。

默认取值:

sseHeader

SseCHeader

可选

参数解释:

服务端解密头信息,详见SseCHeader

约束限制:

如果客户端的对象上传时,使用了客户提供的加密密钥进行服务端加密,当下载对象时,同样也必须在消息中提供密钥v

默认取值:

表3 DateTime

参数名称

参数类型

描述

year

int

参数解释:

UTC时间中的年。

默认取值:

month

int

参数解释:

UTC时间中的月。

默认取值:

day

int

参数解释:

UTC时间中的日。

默认取值:

hour

int

参数解释:

UTC时间中的小时。

约束限制:

24小时制。

默认取值:

0

min

int

参数解释:

UTC时间中的分钟。

默认取值:

0

sec

int

参数解释:

UTC时间中的秒数。

默认取值:

0

表4 SseCHeader

参数名称

参数类型

是否必选

描述

encryption

str

必选

参数解释:

以SSE-C方式加密对象。

取值范围:

AES256,即高级加密标准(Advanced Encryption Standard,AES)。

默认取值:

key

str

必选

参数解释:

SSE-C方式下加密的密钥,与加密方式对应,如encryption=‘AES256’,密钥就是由AES256加密算法得到的密钥。

取值范围:

长度为32字符串。

默认取值:

返回结果

表5 返回结果

类型

说明

GetResult

参数解释:

SDK公共结果对象。

表6 GetResult

参数名称

参数类型

描述

status

int

参数解释:

HTTP状态码。

取值范围:

状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码

默认取值:

reason

str

参数解释:

HTTP文本描述。

默认取值:

errorCode

str

参数解释:

OBS服务端错误码,当status参数小于300时为空。

默认取值:

errorMessage

str

参数解释:

OBS服务端错误描述,当status参数小于300时为空。

默认取值:

requestId

str

参数解释:

OBS服务端返回的请求ID。

默认取值:

indicator

str

参数解释:

OBS服务端返回的错误定位码。

默认取值:

hostId

str

参数解释:

请求的服务端ID,当status参数小于300时为空。

默认取值:

resource

str

参数解释:

发生错误时相关的桶或对象,当status参数小于300时为空。

默认取值:

header

list

参数解释:

响应消息头列表,由多个元组构成。每个元组均包含两个元素,代表响应头的键值对。

默认取值:

body

object

参数解释:

操作成功后的结果数据,当status大于300时为空。该值根据调用接口的不同而不同,参见“桶相关接口”章节和“对象相关接口”章节的详细描述。

默认取值:

表7 GetResult.body

GetResult.body类型

说明

GetObjectMetadataResponse

参数解释:

获取对象元数据响应结果,GetObjectMetadataResponse

表8 GetObjectMetadataResponse

参数名称

参数类型

描述

storageClass

str

参数解释:

对象的存储类型。

取值范围:

  • 当对象存储类型是标准存储时,该值为空。
  • 可选择的存储类型参见存储类型

默认取值:

accessContorlAllowOrigin

str

参数解释:

如果请求中的Origin满足桶的CORS规则,则返回CORS规则中的AllowedOrigin。AllowedOrigin指定允许的跨域请求的来源,即允许来自该域名下的请求访问该对象。

约束限制:

表示域名的字符串,每个匹配规则允许使用最多一个“*”通配符。例如:https://*.vbs.example.com。

默认取值:

accessContorlAllowHeaders

str

参数解释:

如果请求的RequestHeader满足桶的CORS规则,则返回CORS规则中的AllowedHeader。AllowedHeader是指允许的跨域请求的头域。只有匹配上允许的头域中的配置,才被视为是合法的CORS请求。

约束限制:

最多可填写一个“*”通配符,不支持&、:、<、空格以及中文字符。

默认取值:

accessContorlAllowMethods

str

参数解释:

桶CORS规则中的AllowedMethod。AllowedMethod指允许的跨域请求HTTP方法,即桶和对象的几种操作类型。

取值范围:

支持以下HTTP方法:

  • GET
  • PUT
  • HEAD
  • POST
  • DELETE

默认取值:

accessContorlExposeHeaders

str

参数解释:

桶CORS规则中的ExposeHeader。ExposeHeader是指CORS规则允许响应中可返回的附加头域,给客户端提供额外的信息。默认情况下浏览器只能访问以下头域:Content-Length、Content-Type,如果需要访问其他头域,需要在附加头域中配置。

约束限制:

不支持*、&、:、<、空格以及中文字符。

默认取值:

accessContorlMaxAge

int

参数解释:

桶CORS规则中的MaxAgeSeconds。MaxAgeSeconds指请求来源的客户端可以对跨域请求返回结果的缓存时间。

约束限制:

每个CORSRule可以包含至多一个MaxAgeSeconds。

取值范围:

大于等于0的整型数,单位:秒。

默认取值:

100,单位:秒。

contentLength

int

参数解释:

对象数据的长度。

取值范围:

0~48.8TB,单位:字节。

默认取值:

contentType

str

参数解释:

下载对象的文件类型(MIME类型)。contentType(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。

取值范围:

常见的contentType(MIME)列表参见如何理解Content-Type(MIME)?(Python SDK)

默认取值:

lastModified

str

参数解释:

对象的最近一次修改时间。

约束限制:

日期格式为GMT的格式。 例如:Wed, 25 Mar 2020 02:39:52 GMT。

默认取值:

etag

str

参数解释:

对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。

约束限制:

当对象是服务端加密的对象时,ETag值不是对象的MD5值。

取值范围:

长度为32的字符串。

默认取值:

crc64

str

参数解释:

对象的crc64值,即根据ECMA-182标准计算得出的64位CRC。crc64是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时crc64为A,下载对象时crc64为B,则说明对象内容发生了变化。crc64只反映变化的内容,而不是其元数据。

约束限制:

  • 当上传对象校验了crc64值或开启了桶crc64特性的情况下才会返回。
  • 不支持POSIX、SFS对象。

取值范围:

根据ECMA-182标准计算得出的64位CRC。

默认取值:

versionId

str

参数解释:

对象的版本号。

取值范围:

长度为32的字符串。

默认取值:

restore

str

参数解释:

标识对象的恢复状态。对象为归档或深度归档存储类型,并且处于正在恢复或已经恢复时,会返回此头域。

示例:正在恢复ongoing-request="true";已恢复 ongoing-request="false", expiry-date="Wed, 7 Nov 2012 00:00:00 GMT"。其中expiry-date表示对象恢复后的失效时间。

约束限制:

归档或深度归档存储类型对象的恢复状态,如果对象不为归档或深度归档存储类型,则该值为空。

默认取值:

expiration

str

参数解释:

对象的详细过期信息。比如:"expiry-date=\"Mon, 11 Sep 2023 00:00:00 GMT\""

默认取值:

sseKms

str

参数解释:

表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。

取值范围:

可选值:kms,即选择SSE-KMS方式加密对象。

默认取值:

sseKmsKey

str

参数解释:

SSE-KMS加密方式下使用的KMS主密钥的ID值。

取值范围:

有效值支持两种格式:

  1. regionID:domainID(账号ID):key/key_id
  2. key_id

其中:

默认取值:

  • 如果用户没有提供该头域,那么默认的主密钥将会被使用。
  • 如果默认主密钥不存在,将默认创建并使用。

sseC

str

参数解释:

SSE-C方式的算法。

取值范围:

AES256,即高级加密标准(Advanced Encryption Standard,AES)。

默认取值:

sseCKeyMd5

str

参数解释:

SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。

约束限制:

由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ==

默认取值:

websiteRedirectLocation

str

参数解释:

当桶设置了Website配置,可以将获取这个对象的请求重定向到桶内另一个对象或一个外部的URL,该参数指明对象的重定向地址。

例如,重定向请求到桶内另一对象:

WebsiteRedirectLocation:/anotherPage.html

或重定向请求到一个外部URL:

WebsiteRedirectLocation:http://www.example.com/

OBS将这个值从头域中取出,保存在对象的元数据“WebsiteRedirectLocation”中。

约束限制:

  • 必须以“/”、“http://”或“https://”开头,长度不超过2KB。
  • OBS仅支持为桶根目录下的对象设置重定向,不支持为桶中文件夹下的对象设置重定向。

默认取值:

isAppendable

bool

参数解释:

对象是否可被追加上传。

取值范围:

True:可追加上传

False:不可追加上传

认取值:

nextPosition

int

参数解释:

下次追加上传的位置。

取值范围:

0~对象长度,单位:字节。

认取值:

表9 StorageClass

参数名称

参数类型

描述

STANDARD

标准存储

参数解释:

标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。

WARM

低频访问存储

参数解释:

低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。

COLD

归档存储

参数解释:

归档存储适用于很少访问(平均一年访问一次)数据的业务场景。

DEEP_ARCHIVE

深度归档存储(受限公测)

参数解释:

深度归档存储适用于长期不访问(平均几年访问一次)数据的业务场景。

代码样例

本示例用于断点续传下载examplebucket桶里的objectname对象。

 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
39
40
41
from obs import ObsClient
import os
import traceback

# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
# security_token = os.getenv("SecurityToken")
# server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server = "https://obs.cn-north-4.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    bucketName = "examplebucket"
    objectKey = "objectname"
    # 下载到本地的路径,包含本地文件名称的全路径
    downloadFile = 'localfile'
    # 分段下载的并发数
    taskNum = 5
    # 分段的大小
    partSize = 10 * 1024 * 1024
    # True表示开启断点续传
    enableCheckpoint = True
    # 断点续传下载对象
    resp = obsClient.downloadFile(bucketName, objectKey, downloadFile, partSize, taskNum, enableCheckpoint)

    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp.status < 300:
        print('Download File Succeeded')
        print('requestId:', resp.requestId)
    else:
        print('Download File Failed')
        print('requestId:', resp.requestId)
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
except:
    print('Download File Failed')
    print(traceback.format_exc())

相关链接

相关文档