更新时间:2024-02-01 GMT+08:00

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

功能说明

您可以根据需要将存储在OBS中的对象下载到本地。

流式下载指定文件。

接口约束

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

方法定义

func (obsClient ObsClient) GetObject(input *GetObjectInput) (output *GetObjectOutput, err error)

请求参数说明

表1 请求参数列表

参数名称

参数类型

是否必选

描述

input

*GetObjectInput

必选

参数解释:

流式下载请求参数,详见GetObjectInput

表2 GetObjectInput

参数名称

参数类型

是否必选

描述

Bucket

string

必选

参数解释

桶名。

约束限制:

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

默认取值:

Key

string

必选

参数解释:

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

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

取值范围:

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

默认取值:

ResponseCacheControl

string

可选

参数解释:

指定OBS返回请求中Cache-Control头的值。指定Object被下载时的网页的缓存行为。

默认取值:

ResponseContentDisposition

string

可选

参数解释:

指定OBS返回请求中Content-Disposition头的值。指定Object被下载时的名称。

默认取值:

ResponseContentEncoding

string

可选

参数解释:

指定OBS返回请求中Content-Encoding头的值。指定Object被下载时的内容编码格式。

默认取值:

ResponseContentLanguage

string

可选

参数解释:

指定OBS返回请求中Content-Language头的值。指定Object被下载时的内容语言格式。

默认取值:

ResponseContentType

string

可选

参数解释:

指定OBS返回请求中Content-Type头的值。指定Object文件类型。

默认取值:

ResponseExpires

string

可选

参数解释:

指定OBS返回请求中Expires头的值。指定Object被下载时的网页的缓存过期时间。

默认取值:

VersionId

string

可选

参数解释:

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

取值范围:

长度为32的字符串。

默认取值:

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

ImageProcess

string

可选

参数解释:

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

取值范围:

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

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

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

默认取值:

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

RangeStart

int64

可选

参数解释:

指定下载对象的起始位置。

取值范围:

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

默认取值:

0,即从对象的第一个字节开始下载。

RangeEnd

int64

可选

参数解释:

指定下载对象的结束位置。

取值范围:

  • 取值必须大于RangeStart。
  • 如果该值大于对象长度-1,实际仍取对象长度-1,单位为字节。

默认取值:

IfMatch

string

可选

参数解释:

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

取值范围:

长度为32的字符串。

默认取值:

IfNoneMatch

string

可选

参数解释:

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

取值范围:

长度为32的字符串。

默认取值:

IfModifiedSince

time.Time

可选

参数解释:

如果对象的修改时间晚于该参数值指定的时间,则返回对象内容,否则返回错误。

约束限制:

日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间晚于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。

代码示例:time.Now().Add(time.Duration(24) * time.Hour)

默认取值:

IfUnmodifiedSince

time.Time

可选

参数解释:

如果对象的修改时间早于该参数值指定的时间,则返回对象内容,否则返回错误。

约束限制:

日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间早于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。

代码示例:time.Now().Add(time.Duration(24) * time.Hour)

默认取值:

SseHeader

SseCHeader

可选

参数解释:

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

约束限制:

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

表3 SseCHeader

参数名称

参数类型

是否必选

描述

Encryption

string

作为请求参数时必选

参数解释:

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

取值范围:

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

默认取值:

Key

string

作为请求参数时必选

参数解释:

SSE-C方式下加密使用的密钥,该密钥用于加密对象。

约束限制:

该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw=

默认取值:

KeyMD5

string

作为请求参数时可选

参数解释:

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

约束限制:

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

默认取值:

返回结果说明

表4 返回结果

参数名称

参数类型

描述

output

*GetObjectOutput

参数解释:

接口返回信息,详见GetObjectOutput

err

error

参数解释:

接口返回错误信息。

表5 GetObjectOutput

参数名称

参数类型

描述

StatusCode

int

参数解释:

HTTP状态码。

取值范围:

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

默认取值:

RequestId

string

参数解释:

OBS服务端返回的请求ID。

默认取值:

ResponseHeaders

map[string][]string

参数解释:

HTTP响应头信息。

默认取值:

Body

io.ReadCloser

参数解释:

下载对象的数据流。

默认取值:

StorageClass

StorageClassType

参数解释:

对象的存储类型。

取值范围:

对象存储类型的取值范围参见StorageClassType

默认取值:

AllowOrigin

string

参数解释:

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

约束限制:

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

默认取值:

AllowHeader

string

参数解释:

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

约束限制:

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

默认取值:

AllowMethod

string

参数解释:

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

取值范围:

支持以下HTTP方法:

  • GET
  • PUT
  • HEAD
  • POST
  • DELETE

默认取值:

ExposeHeader

string

参数解释:

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

约束限制:

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

默认取值:

MaxAgeSeconds

int

参数解释:

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

约束限制:

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

取值范围:

0~(231-1),单位:秒。

默认取值:

100,单位:秒。

ContentLength

int64

参数解释:

对象数据的长度。

取值范围:

0~48.8TB,单位:字节

默认取值:

CacheControl

string

参数解释:

响应中的Cache-Control头。指定对象被下载时的网页的缓存行为。

默认取值:

ContentDisposition

string

参数解释:

响应中的Content-Disposition头。

默认取值:

ContentEncoding

string

参数解释:

响应中的Content-Encoding头。

默认取值:

ContentLanguage

string

参数解释:

响应中的Content-Language头。

默认取值:

无。

ContentType

string

参数解释:

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

取值范围:

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

默认取值:

如果您在上传Object时未指定Content-Type,SDK会根据指定Object名称的后缀名来判定文件类型并自动填充Content-Type。

Expires

string

参数解释:

响应中的Expires头。

默认取值:

LastModified

time.Time

参数解释:

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

约束限制:

日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示最后一次修改时间为2018-01-01T00:00:00.000Z。

默认取值:

ETag

string

参数解释:

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

约束限制:

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

取值范围:

长度为32的字符串。

默认取值:

VersionId

string

参数解释:

对象的版本号。

取值范围:

长度为32的字符串。

默认取值:

Restore

string

参数解释:

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

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

约束限制:

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

默认取值:

Expiration

string

参数解释:

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

默认取值:

SseHeader

SseCHeader

SseKmsHeader

参数解释:

服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader

WebsiteRedirectLocation

string

参数解释:

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

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

WebsiteRedirectLocation:/anotherPage.html

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

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

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

约束限制:

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

默认取值:

Metadata

map[string]string

参数解释:

对象自定义元数据。OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。

约束限制:

  • 所有自定义元数据大小的总和不超过8K。单个自定义元数据大小的计算方式为:每个键和值的UTF-8 编码中的字节总数。
  • 自定义元数据的key值不区分大小写,OBS统一转为小写进行存储。value值区分大小写。
  • 自定义元数据key-value对都必须符合US-ASCII。如果一定要使用非ASCII码或不可识别字符,需要客户端自行做编解码处理,可以采用URL编码或者Base64编码,服务端不会做解码处理。

默认取值:

表6 StorageClassType

常量名

原始值

说明

StorageClassStandard

STANDARD

标准存储。

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

StorageClassWarm

WARM

低频访问存储。

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

StorageClassCold

COLD

归档存储。

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

表7 SseCHeader

参数名称

参数类型

是否必选

描述

Encryption

string

作为请求参数时必选

参数解释:

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

取值范围:

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

默认取值:

Key

string

作为请求参数时必选

参数解释:

SSE-C方式下加密使用的密钥,该密钥用于加密对象。

约束限制:

该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw=

默认取值:

KeyMD5

string

作为请求参数时可选

参数解释:

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

约束限制:

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

默认取值:

表8 SseKmsHeader

参数名称

参数类型

是否必选

描述

Encryption

string

作为请求参数时必选

参数解释:

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

取值范围:

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

默认取值:

Key

string

作为请求参数时可选

参数解释:

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

取值范围:

有效值支持两种格式:

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

其中:

默认取值:

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

代码示例

本示例用于流式下载examplebucket桶中的example/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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main
import (
    "fmt"
    "os"
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)
func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写。
    endPoint := "https://obs.ap-southeast-1.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/)
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }
    input := &obs.GetObjectInput{}
    // 指定存储桶名称
    input.Bucket = "examplebucket"
    // 指定下载对象,此处以 example/objectname 为例。
    input.Key = "example/objectname"
    // 流式下载对象
    output, err := obsClient.GetObject(input)
    if err == nil {
        // output.Body 在使用完毕后必须关闭,否则会造成连接泄漏。
        defer output.Body.Close()
        fmt.Printf("Get object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket)
        fmt.Printf("StorageClass:%s, ETag:%s, ContentType:%s, ContentLength:%d, LastModified:%s\n",
            output.StorageClass, output.ETag, output.ContentType, output.ContentLength, output.LastModified)
        // 读取对象内容
        p := make([]byte, 1024)
        var readErr error
        var readCount int
        for {
            readCount, readErr = output.Body.Read(p)
            if readCount > 0 {
                fmt.Printf("%s", p[:readCount])
            }
            if readErr != nil {
                break
            }
        }
        return
    }
    fmt.Printf("List objects under the bucket(%s) fail!\n", input.Bucket)
    if obsError, ok := err.(obs.ObsError); ok {
        fmt.Println("An ObsError was found, which means your request sent to OBS was rejected with an error response.")
        fmt.Println(obsError.Error())
    } else {
        fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.")
        fmt.Println(err)
    }
}

GetObjectOutput.Body获取的可读流一定要显式关闭,否则会造成资源泄露。

相关链接