更新时间:2024-11-13 GMT+08:00
分享

下载对象-流式下载(Python SDK)

功能说明

您可以根据需要将存储在OBS中的对象下载到本地。流式下载指定文件。

接口约束

  • 您必须是桶拥有者或拥有下载对象的权限,才能下载对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:GetObject权限,如果使用桶策略则需授予GetObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略配置对象策略
  • OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点
  • 对于存储类别为归档存储或深度归档存储的对象,需要确认对象的状态为“已恢复”才能对其进行下载。

方法定义

ObsClient.getObject(bucketName, objectKey, downloadPath, getObjectRequest, headers, loadStreamInMemory, 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的字符串。

默认取值:

downloadPath

str

可选

参数解释:

下载对象的目标路径,包含文件名,如aa/bb.txt。

默认取值:

getObjectRequest

GetObjectRequest

可选

参数解释:

下载对象的附加请求参数。

取值范围:

参考GetObjectRequest

默认取值:

headers

GetObjectHeader

可选

参数解释:

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

取值范围:

参考GetObjectHeader

默认取值:

loadStreamInMemory

bool

可选

参数解释:

是否将对象的数据流加载到内存。

取值范围:

True:忽略downloadPath参数,并将获取的数据流直接加载到内存。

False:不将对象的数据流加载到内存。

默认取值:

False

progressCallback

callable

可选

参数解释:

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

默认取值:

说明:

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

extensionHeaders

dict

可选

参数解释:

接口的拓展头域。

取值范围:

参考自定义头域

默认取值:

表2 GetObjectRequest

参数名称

参数类型

是否必选

描述

cache_control

str

可选

参数解释:

获取对象时重写响应中的Cache-Control头。

默认取值:

content_disposition

str

可选

参数解释:

获取对象时重写响应中的Content-Disposition头。

默认取值:

content_encoding

str

可选

参数解释:

获取对象时重写响应中的Content-Encoding头。

默认取值:

content_language

str

可选

参数解释:

获取对象时重写响应中的Content-Language头。

默认取值:

content_type

str

可选

参数解释:

获取对象时重写响应中的Content-Type头。

默认取值:

expires

str

可选

参数解释:

获取对象时重写响应中的Expires头。

默认取值:

versionId

str

可选

参数解释:

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

取值范围:

长度为32的字符串。

默认取值:

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

imageProcess

str

可选

参数解释:

图片处理参数,描述针对对象的图片处理命令或处理样式。例如表示对图片依次进行缩放、旋转,取值:image/resize,m_fixed,w_100,h_100/rotate,90。

取值范围:

命令方式:image/命令参数。

样式方式:style/样式名称。

详细参数说明参见处理图片

默认取值:

如果不输入处理命令,将返回原图。

表3 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

约束限制:

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

默认取值:

表4 DateTime

参数名称

参数类型

描述

year

int

参数解释:

UTC时间中的年。

默认取值:

month

int

参数解释:

UTC时间中的月。

默认取值:

day

int

参数解释:

UTC时间中的日。

默认取值:

hour

int

参数解释:

UTC时间中的小时。

约束限制:

24小时制。

默认取值:

0

min

int

参数解释:

UTC时间中的分钟。

默认取值:

0

sec

int

参数解释:

UTC时间中的秒数。

默认取值:

0

表5 SseCHeader

参数名称

参数类型

是否必选

描述

encryption

str

必选

参数解释:

以SSE-C方式加密对象。

取值范围:

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

默认取值:

key

str

必选

参数解释:

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

取值范围:

长度为32字符串。

默认取值:

返回结果

表6 返回结果

类型

说明

GetResult

参数解释:

SDK公共结果对象。

表7 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时为空。该值根据调用接口的不同而不同,参见“桶相关接口”章节和“对象相关接口”章节的详细描述。

默认取值:

表8 GetResult.body

GetResult.body类型

说明

ObjectStream

参数解释:

下载对象响应结果。

表9 ObjectStream

参数名称

参数类型

描述

response

object

参数解释:

当请求参数中loadStreamInMemory为False且downloadPath为空时,返回该字段,代表一个可读流,可以从中读取对象的内容。

默认取值:

buffer

object

参数解释:

当请求参数中loadStreamInMemory为True时,返回该字段,代表内存中对象的数据流。

默认取值:

size

int

参数解释:

当请求参数中loadStreamInMemory为True时,返回该字段,代表数据流的长度。

取值范围:

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

默认取值:

url

str

参数解释:

当请求参数中loadStreamInMemory为False且downloadPath不为空时,返回该字段,代表下载路径。

默认取值:

deleteMarker

bool

参数解释:

标识删除的对象是否是删除标记。

取值范围:

  • True:是删除标记。
  • False:不是删除标记。

默认取值:

False

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,单位:字节。

默认取值:

cacheControl

str

参数解释:

响应中的Cache-Control头。

默认取值:

contentDisposition

str

参数解释:

响应中的Content-Disposition头。

默认取值:

contentEncoding

str

参数解释:

响应中的Content-Encoding头

默认取值:

contentLanguage

str

参数解释:

响应中的Content-Language头

默认取值:

contentType

str

参数解释:

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

取值范围:

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

默认取值:

expires

str

参数解释:

响应中的Expires头

默认取值:

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仅支持为桶根目录下的对象设置重定向,不支持为桶中文件夹下的对象设置重定向。

默认取值:

表10 StorageClass

参数名称

参数类型

描述

STANDARD

标准存储

参数解释:

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

WARM

低频访问存储

参数解释:

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

COLD

归档存储

参数解释:

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

DEEP_ARCHIVE

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

参数解释:

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

代码样例

本示例用于流式下载对象。

 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
42
43
44
from obs import GetObjectRequest
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:
    # 下载对象的附加请求参数
    getObjectRequest = GetObjectRequest()
    # 获取对象时重写响应中的Content-Type头。
    getObjectRequest.content_type = 'text/plain'
    bucketName="examplebucket"
    objectKey="objectname"
    #流式下载
    resp = obsClient.getObject(bucketName=bucketName,objectKey=objectKey, getObjectRequest=getObjectRequest, loadStreamInMemory=False)
    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp.status < 300:
        print('Get Object Succeeded')
        print('requestId:', resp.requestId)
        # 读取对象内容
        while True:
            chunk = resp.body.response.read(65536)
            if not chunk:
                break
            print(chunk)
        resp.body.response.close()
    else:
        print('Get Object Failed')
        print('requestId:', resp.requestId)
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
except:
    print('Get Object Failed')  
    print(traceback.format_exc())

相关链接

相关文档