上传对象-流式上传(Go SDK)
功能说明
您可以将本地文件直接上传至OBS指定的位置。待上传的文件可以是任何类型:文本文件、图片、视频等。
通过SDK的流式上传,可以上传小于5GB的文件。本章节介绍如何使用Go SDK流式上传对象。
流式上传使用io.Reader作为对象的数据源,可以通过ObsClient.PutObject上传数据流到OBS。
接口约束
- 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。
- OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
- 单次上传对象大小范围是[0, 5GB]。
- 如果需要上传超过5GB的大文件,需要通过多段操作来分段上传。
方法定义
func (obsClient ObsClient) PutObject(input *PutObjectInput, extensions...extensionOptions) (output *PutObjectOutput, err error)
请求参数说明
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| input | 必选 | 参数解释: 流式上传请求参数,详见PutObjectInput。 | |
| extensions | 可选 | 参数解释: 桶相关扩展信息。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参考extensionOptions。 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Bucket | string | 必选 | 参数解释: 桶名。 约束限制:
默认取值: 无 |
| Key | string | 必选 | 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
| ContentMD5 | string | 可选 | 参数解释: 待上传对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。 取值范围: 按照RFC 1864标准计算出消息体的MD5摘要字符串,即消息体128-bit MD5值经过base64编码后得到的字符串。 示例:n58IG6hfM7vqI4K0vnWpog==。 默认取值: 无 |
| ACL | 可选 | 参数解释: 创建对象时可指定的预定义ACL。有关访问控制列表(Access Control List,ACL)功能的详细信息可参见ACL功能介绍。 取值范围: 可选择的ACL选项参见AclType。 默认取值: 无 | |
| WebsiteRedirectLocation | string | 可选 | 参数解释: 当桶设置了Website配置,可以将获取这个对象的请求重定向到桶内另一个对象或一个外部的URL。 例如,重定向请求到桶内另一对象: WebsiteRedirectLocation:/anotherPage.html 或重定向请求到一个外部URL: WebsiteRedirectLocation:http://www.example.com/ OBS将这个值从头域中取出,保存在对象的元数据“WebsiteRedirectLocation”中。 约束限制:
默认取值: 无 |
| ContentType | string | 可选 | 参数解释: 待上传对象的文件类型(MIME类型)。Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定对象文件的打开方式。 取值范围: 常见的Content-Type(MIME)列表参见如何理解Content-Type(MIME)? 默认取值: 如果您在上传Object时未指定Content-Type,SDK会根据指定Object名称的后缀来判定文件类型并自动填充Content-Type。 |
| ContentLength | int64 | 可选 | 参数解释: 待上传对象数据的长度。 约束限制:
默认取值: 如果不传,则sdk会自动计算上传对象数据的长度。 |
| SseHeader | 或 | 可选 | 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader。 |
| StorageClass | 可选 | 参数解释: 创建对象时,可以加上此头域设置对象的存储类型。 取值范围: 可选择的存储类型参见StorageClassType。 默认取值: 如果未设置此头域,则对象的存储类型默认为桶的存储类型。 | |
| Metadata | map[string]string | 可选 | 参数解释: 待上传对象的自定义元数据。OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。 约束限制:
默认取值: 无 |
| Body | io.Reader | 可选 | 参数解释: 待上传对象的数据流。 约束限制:
默认取值: 无 |
| GrantReadId | string | 可选 | 参数解释: 被授予READ权限的账号的账号ID,即domain_id。账号被授予READ权限后,针对当前对象,允许被授权指定账号有读对象和获取对象元数据的权限。 取值范围: 获取账号ID的方法请参见如何获取账号ID和用户ID? 默认取值: 无 |
| GrantReadAcpId | string | 可选 | 参数解释: 被授予READ_ACP权限的账号的账号ID,即domain_id。账号被授予READ_ACP权限后,针对当前对象,允许读取对象的ACL。 取值范围: 获取账号ID的方法请参见如何获取账号ID和用户ID? 默认取值: 无 |
| GrantWriteAcpId | string | 可选 | 参数解释: 被授予WRITE_ACP权限的账号的账号ID,即domain_id。账号被授予WRITE_ACP权限后,针对当前对象,允许写对象的ACL。 取值范围: 获取账号ID的方法请参见如何获取账号ID和用户ID? 默认取值: 无 |
| GrantFullControlId | string | 可选 | 参数解释: 被授予FULL_CONTROL权限的账号的账号ID,即domain_id。账号被授予FULL_CONTROL权限后,针对当前对象,授权指定账号有读对象、获取对象元数据、获取对象ACL、写对象ACL的权限。 取值范围: 获取账号ID的方法请参见如何获取账号ID和用户ID? 默认取值: 无 |
| Expires | int64 | 可选 | 参数解释: 表示对象的过期时间(从对象最后修改时间开始计算),过期之后对象会被自动删除。 取值范围: 大于0的正整型,单位:天。 默认取值: 无 |
| 常量名 | 原始值 | 说明 |
|---|---|---|
| AclPrivate | private | 私有读写。 桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。 |
| AclPublicRead | public-read | 公共读私有写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。 设在对象上,所有人可以获取该对象内容和元数据。 |
| AclPublicReadWrite | public-read-write | 公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。 设在对象上,所有人可以获取该对象内容和元数据。 |
| AclPublicReadDelivered | public-read-delivered | 桶公共读,桶内对象公共读。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本,可以获取该桶内对象的内容和元数据。 说明: AclPublicReadDelivered不能应用于对象。 |
| AclPublicReadWriteDelivered | public-read-write-delivered | 桶公共读写,桶内对象公共读写。 设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,可以获取该桶内对象的内容和元数据。 说明: AclPublicReadWriteDelivered不能应用于对象。 |
| AclBucketOwnerFullControl | bucket-owner-full-control | 设在对象上,桶和对象的所有者拥有对象的完全控制权限,其他任何人都没有访问权限。 默认情况下,上传对象至其他用户的桶中,桶拥有者没有对象的控制权限。对象拥有者为桶拥有者添加此权限控制策略后,桶所有者可以完全控制对象。例如,用户A上传对象x至用户B的桶中,系统默认用户B没有对象x的控制权。当用户A为对象x设置bucket-owner-full-control后,用户B就拥有了对象x的控制权。 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| 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== 默认取值: 无 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Encryption | string | 作为请求参数时必选 | 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 |
| Key | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式:
其中:
默认取值:
|
| ProjectID | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下KMS主密钥所属的项目ID(非企业项目ID)。 约束限制: 无 取值范围: 与Key指定的密钥ID相匹配的项目ID(非企业项目ID)。 默认取值: 无 |
| 常量名 | 原始值 | 说明 |
|---|---|---|
| StorageClassStandard | STANDARD | 标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。 |
| StorageClassWarm | WARM | 低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
| StorageClassCold | COLD | 归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
| StorageClassDeepArchive | DEEP_ARCHIVE | 深度归档存储 适用于长期不访问(平均几年访问一次)数据的业务场景。 |
| StorageClassINTELLIGENTTIERING | INTELLIGENT_TIERING | 智能分级存储 通过访问模式的变化,自动将对象数据转移到更经济的访问层来优化存储成本,因而适用于数据不断变化或数据不可预测的业务场景。 |
返回结果说明
| 参数名称 | 参数类型 | 描述 |
|---|---|---|
| output | 参数解释: 接口返回信息,详见PutObjectOutput。 | |
| err | error | 参数解释: 接口返回错误信息。 |
| 参数名称 | 参数类型 | 描述 |
|---|---|---|
| StatusCode | int | 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 |
| RequestId | string | 参数解释: OBS服务端返回的请求ID。 默认取值: 无 |
| ResponseHeaders | map[string][]string | 参数解释: HTTP响应头信息。 默认取值: 无 |
| StorageClass | 参数解释: 对象的存储类型。 取值范围:
默认取值: 无 | |
| VersionId | string | 参数解释: 对象的版本号。如果桶的多版本状态为开启,则会返回对象的版本号。 取值范围: 长度为32的字符串。 默认取值: 无 |
| ETag | string | 参数解释: 对象的ETag值,即base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 |
| SseHeader | 或 | 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader。 |
| 常量名 | 原始值 | 说明 |
|---|---|---|
| StorageClassStandard | STANDARD | 标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。 |
| StorageClassWarm | WARM | 低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
| StorageClassCold | COLD | 归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
| StorageClassDeepArchive | DEEP_ARCHIVE | 深度归档存储 适用于长期不访问(平均几年访问一次)数据的业务场景。 |
| StorageClassINTELLIGENTTIERING | INTELLIGENT_TIERING | 智能分级存储 通过访问模式的变化,自动将对象数据转移到更经济的访问层来优化存储成本,因而适用于数据不断变化或数据不可预测的业务场景。 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| 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== 默认取值: 无 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Encryption | string | 作为请求参数时必选 | 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 |
| Key | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式:
其中:
默认取值:
|
| ProjectID | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下KMS主密钥所属的项目ID(非企业项目ID)。 约束限制: 无 取值范围: 与Key指定的密钥ID相匹配的项目ID(非企业项目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 | package main import ( "fmt" "os" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。 //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/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.cn-north-4.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.PutObjectInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定上传对象,此处以 example/objectname 为例。 input.Key = "example/objectname" fd, _ := os.Open("localfile") input.Body = fd // 流式上传本地文件 output, err := obsClient.PutObject(input) if err == nil { fmt.Printf("Put object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket) fmt.Printf("StorageClass:%s, ETag:%s\n", output.StorageClass, output.ETag) return } fmt.Printf("Put object(%s) under the bucket(%s) fail!\n", input.Key, 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) } } |
本示例用于将base64格式的图片上传到examplebucket桶中的example/test.png对象
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 | package main import ( "fmt" "os" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/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.cn-north-4.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()) } //base64格式编码的标准格式为 data:[mediaType];base64,[encodedData] base64Image := "data:image/png;base64,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" b64data := base64Image[strings.IndexByte(base64Image, ',')+1:] decode, err := base64.StdEncoding.DecodeString(b64data) if err != nil { return } input := &obs.PutObjectInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定上传对象名,此处以 example/objectname 为例。 input.Key = "example/test.png" input.Body = bytes.NewReader(decode) // 流式上传本地文件 output, err := obsClient.PutObject(input) if err == nil { fmt.Printf("Put object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket) fmt.Printf("RequestId:%s, ETag:%s\n", output.RequestId, output.ETag) return } fmt.Printf("Put object(%s) under the bucket(%s) fail!\n", input.Key, 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) } } |