华为云用户手册

  • 代码样例 本示例用于通过指定多段上传任务号(uploadId),上传段到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 package main import ( "fmt" "os" "strings" 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.UploadPartInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定对象名,此处以 example/objectname 为例。 input.Key = "example/objectname" // 指定多段上传任务号,此处以00000188677110424014075CC4A77xxx为例。 input.UploadId = "00000188677110424014075CC4A77xxx" // 指定上传段的段号,取值为从1到10000的整数。这次以1为例。 input.PartNumber = 1 // 指定待上传段的源文件路径,这里以localfile为例。 input.SourceFile = "localfile" // 上传段 output, err := obsClient.UploadPart(input) if err == nil { fmt.Printf("Upload part(%d) successful with bucket(%s) and object(%s)!!\n", input.PartNumber, input.Bucket, input.Key) fmt.Printf("ETag:%s\n", output.ETag) return } fmt.Printf("Upload part(%d) fail with bucket(%s) and object(%s)!!\n", input.PartNumber, input.Bucket, input.Key) 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) } }
  • 返回结果说明 表4 返回结果 参数名称 参数类型 描述 output *UploadPartOutput 参数解释: 接口返回信息。详情参见UploadPartOutput。 err error 参数解释: 接口返回错误信息。 表5 UploadPartOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 PartNumber int 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 ETag string 参数解释: 对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 SseHeader SseCHeader 或 SseKmsHeader 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader。 表6 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== 默认取值: 无 表7 SseKmsHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 Key string 作为请求参数时可选 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式: regionID:domainID(账号ID):key/key_id key_id 其中: regionID是使用密钥所属region的ID,可在地区和终端节点页面获取; domainID是使用密钥所属账号的账号ID,获取方法参见如何获取账号ID和用户ID?; key_id是从数据加密服务创建的密钥ID,获取方法请参见查看密钥。 默认取值: 如果用户没有提供该头域,那么默认的主密钥将会被使用。 如果默认主密钥不存在,将默认创建并使用。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *UploadPartInput 必选 参数解释: 上传段请求参数。详情参见UploadPartInput。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参见extensionOptions。 表2 UploadPartInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 PartNumber int 必选 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 UploadId string 必选 参数解释: 分段上传任务的ID。任务ID可以通过初始化分段上传任务生成。 约束限制: 取值范围: 长度为32的字符串,例如: 000001648453845DBB78F2340DD460D8。 默认取值: 无 ContentMD5 string 可选 参数解释: 待上传对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。 取值范围: 按照RFC 1864标准计算出消息体的MD5摘要字符串,即消息体128-bit MD5值经过base64编码后得到的字符串。 示例:n58IG6hfM7vqI4K0vnWpog==。 默认取值: 无 SseHeader SseCHeader 可选 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader。 Body io.Reader 可选 参数解释: 待上传对象的数据流。 取值范围: 0~48.8TB,单位:字节。 默认取值: 无 SourceFile string 可选 参数解释: 待上传对象的源文件路径。 默认取值: 无 Offset int64 可选 参数解释: 源文件中某一分段的起始偏移大小。 取值范围: 非负整数,小于待上传对象的大小,单位:字节。 默认取值: 0 PartSize int64 可选 参数解释: 当前段的长度。 取值范围: 100KB~5GB,单位:字节。 默认取值: 102400字节 表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== 默认取值: 无
  • 功能说明 初始化分段上传任务后,通过分段上传任务的ID,上传段到指定桶中。除了最后一段以外,其他段的大小范围是100KB~5GB;最后一段的大小范围是0~5GB。上传的段的编号也有范围限制,其范围是1~10000。 上传段时,除了指定上传ID,还必须指定段编号。您可以选择1和10000之间的任意段编号。段编号在您正在上传的对象中唯一地标示了段及其位置。如果您使用之前上传的段的同一段编号上传新段,则之前上传的段将被覆盖。无论您何时上传段,OBS都将在其响应中返回ETag标头。对于每个段上传任务,您必须记录每个段编号和ETag值。您在随后的请求中需要添加这些值以完成多段上传。
  • 接口约束 您必须是桶拥有者或拥有上传段的权限,才能上传段。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,才能停止收取已上传的段的存储费用。仅当在合并段或取消多段上传任务之后,OBS才释放段存储并停止向您收取段存储费用。 段任务中的partNumber是唯一的,重复上传相同partNumber的段,后一次上传会覆盖前一次上传内容。多并发上传同一对象的同一partNumber时,服务端遵循Last Write Win策略,但“Last Write”的时间定义为段元数据创建时间。为了保证数据准确性,客户端需要加锁保证同一对象的同一个段上传的并发性。同一对象的不同段并发上传不需要加锁。
  • 上传对象 完成桶创建后,您可以往桶中上传对象。 本示例用于将本地localfile文件上传到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.PutFileInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定上传对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 指定本地文件,此处以localfile为例 input.SourceFile = "localfile" // 文件上传 output, err := obsClient.PutFile(input) if err == nil { fmt.Printf("Put file(%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 file(%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) } } 更多上传对象的信息,请参见上传对象。
  • 创建桶 桶是OBS全局命名空间,相当于数据的容器、文件系统的根目录,可以存储若干对象。 本示例用于创建名为examplebucket的桶,并设置所在区域在华北-北京四(cn-north-4),桶的权限访问控制策略是私有桶,存储类型是低频访问存储,多AZ方式存储。 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 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.CreateBucketInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定存储桶所在区域,此处以“cn-north-4”为例,必须跟传入的Endpoint中Region保持一致。 input.Location = "cn-north-4" // 指定存储桶的权限控制策略,此处以obs.AclPrivate为例。 input.ACL = obs.AclPrivate // 指定存储桶的存储类型,此处以obs.StorageClassWarm为例。如果未指定该参数,则创建的桶为标准存储类型。 input.StorageClass = obs.StorageClassWarm // 指定存储桶的AZ类型,此处以“3AZ”为例。不携带时默认为单AZ,如果对应region不支持多AZ存储,则该桶的存储类型仍为单AZ。 input.AvailableZone = "3az" // 创建桶 output, err := obsClient.CreateBucket(input) if err == nil { fmt.Printf("Create bucket:%s successful!\n", input.Bucket) fmt.Printf("RequestId:%s\n", output.RequestId) return } fmt.Printf("Create 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) } } 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 更多创建桶的信息,请参见创建桶。 创建桶时,如果使用的终端节点归属于默认区域华北-北京一(cn-north-1),则可以不指定区域;如果使用的终端节点归属于其他区域,则必须指定区域(指定方法参见带参数创建),且指定的区域必须与终端节点归属的区域一致。当前有效的区域名称可从这里查询。
  • 初始化OBS客户端 向OBS发送任一HTTP/HTTPS请求之前,必须先创建一个ObsClient结构体: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // 引入依赖包 import ( 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.WithSignature(obs.SignatureObs)/*, obs.WithSecurityToken(securityToken)*/) if err == nil { // 使用访问OBS // 关闭obsClient obsClient.Close() } } 更多关于OBS客户端初始化的内容请参考“初始化”章节。 日志配置详见日志初始化。 如果设置的endpoint不带协议类型,则默认使用HTTPS协议。 出于DNS解析性能和OBS服务可靠性的考虑,不允许将endpoint设置为IP,必须使用域名访问OBS服务。
  • 接口约束 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 单次上传对象大小范围是[0, 5GB]。 如果需要上传超过5GB的大文件,需要通过多段操作来分段上传。
  • 代码示例 本示例用于将本地localfile文件上传到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.PutFileInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定上传对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 指定本地文件,此处以localfile为例 input.SourceFile = "localfile" // 文件上传 output, err := obsClient.PutFile(input) if err == nil { fmt.Printf("Put file(%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 file(%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) } }
  • 代码样例 本示例用于复制源桶(sourcebucketname)下对象(example/sourceobjectname)的段到目标桶(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 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.CopyPartInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 指定复制源桶名,此处以sourcebucketname为例。 input.CopySourceBucket = "sourcebucketname" // 指定复制源桶名下的指定源对象名,此处以example/sourceobjectname为例。 input.CopySourceKey = "example/sourceobjectname" // 指定上传段的段号,此处以1为例。 input.PartNumber = 1 // 复制段 output, err := obsClient.CopyPart(input) if err == nil { fmt.Printf("Copy part(bucket:%s, object: %s) successful from bucket:%s's object: %s!\n", input.Bucket, input.Key, input.CopySourceBucket, input.CopySourceKey) fmt.Printf("ETag:%s, LastModified:%s\n", output.ETag, output.LastModified) return } fmt.Printf("Copy part(bucket:%s, object: %s) fail from bucket:%s's object: %s!\n", input.Bucket, input.Key, input.CopySourceBucket, input.CopySourceKey) 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) } }
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *CopyPartInput 必选 参数解释: 复制段请求参数。详情参见CopyPartInput。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参考extensionOptions。 表2 CopyPartInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 目标桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 PartNumber int 必选 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 UploadId string 必选 参数解释: 分段上传任务的ID,例如:000001648453845DBB78F2340DD460D8 取值范围: 长度为32的字符串。 默认取值: 无 CopySourceBucket string 必选 参数解释: 源桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 CopySourceKey string 必选 参数解释: 源对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 CopySourceRangeStart int64 可选 参数解释: 指定复制源对象的起始位置。 取值范围: 非负整数,单位为字节。 默认取值: 0 CopySourceRangeEnd int64 可选 参数解释: 指定复制源对象的结束位置。 约束限制: 取值必须大于RangeStart,如果该值大于对象长度-1,实际仍取对象长度-1,单位为字节。 取值范围: 非负整数,单位为字节。 默认取值: 无 SseHeader SseCHeader 可选 参数解释: 服务端加密头信息,用于加密目标对象。详情参见SseCHeader。 约束限制: 如果客户端的对象上传时,使用了客户提供的加密密钥进行服务端加密,当下载对象时,同样也必须在消息中提供密钥。 SourceSseHeader 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 *CopyPartOutput type CopyPartOutput struct 参数解释: 接口返回信息。详情参见CopyPartOutput。 err error 参数解释: 接口返回错误信息。 表5 CopyPartOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 ETag string 参数解释: 对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 LastModified time.Time 参数解释: 目标段的最近一次修改时间(UTC时间)。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示最后一次修改时间为2018-01-01T00:00:00.000Z。 代码示例:time.Now().Add(time.Duration(24) * time.Hour) 默认取值: 无 SseHeader SseCHeader type SseCHeader struct 或 SseKmsHeader type SseKmsHeader struct 参数解释: 服务端加密头信息。SSE-C加密方式详情参见SseCHeader,SSE-KMS加密方式详情参见SseKmsHeader。 PartNumber int 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 表6 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== 默认取值: 无 表7 SseKmsHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 Key string 作为请求参数时可选 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式: regionID:domainID(账号ID):key/key_id key_id 其中: regionID是使用密钥所属region的ID,可在地区和终端节点页面获取; domainID是使用密钥所属账号的账号ID,获取方法参见如何获取账号ID和用户ID?; key_id是从数据加密服务创建的密钥ID,获取方法请参见查看密钥。 默认取值: 如果用户没有提供该头域,那么默认的主密钥将会被使用。 如果默认主密钥不存在,将默认创建并使用。
  • 功能说明 初始化分段上传任务后,通过分段上传任务的ID,复制段到指定桶中。 多段上传任务创建后,用户可以通过指定多段上传任务号,为特定的任务上传段。添加段的方式还包括调用段拷贝接口。允许客户将已上传对象的一部分或全部拷贝为段。 将源对象object拷贝为一个段part1,如果在拷贝操作之前part1已经存在,拷贝操作执行之后,旧的段数据part1会被新拷贝的段数据覆盖。拷贝成功后,只能列举到最新的段part1,旧的段数据将会被删除。因此在使用拷贝段接口时请确保目标段不存在或者已无价值,避免因拷贝段导致数据误删除。拷贝过程中源对象object无任何变化。
  • 接口约束 您必须是桶拥有者或拥有复制段的权限,才能复制段。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 拷贝段的结果不能仅根据HTTP返回头域中的status_code来判断请求是否成功,头域中status_code返回200时表示服务端已经收到请求,且开始处理拷贝段请求。拷贝是否成功会在响应消息的body中,只有body体中有ETag标签才表示成功,否则表示拷贝失败。
  • 返回结果说明 表5 返回结果列表 参数名称 参数类型 描述 output *BaseModel 参数解释: 接口返回信息,详见BaseModel。 err error 参数解释: 接口返回错误信息。 表6 BaseModel 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无
  • 代码示例 本示例用于创建名为examplebucket的桶,并设置所在区域在华北-北京四(cn-north-4),桶的权限访问控制策略是私有桶,存储类型是低频访问存储,多AZ方式存储。 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 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.CreateBucketInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定存储桶所在区域,此处以“cn-north-4”为例,必须跟传入的Endpoint中Region保持一致。 input.Location = "cn-north-4" // 指定存储桶的权限控制策略,此处以obs.AclPrivate为例。 input.ACL = obs.AclPrivate // 指定存储桶的存储类型,此处以obs.StorageClassWarm为例。如果未指定该参数,则创建的桶为标准存储类型。 input.StorageClass = obs.StorageClassWarm // 指定存储桶的AZ类型,此处以“3AZ”为例。不携带时默认为单AZ,如果对应region不支持多AZ存储,则该桶的存储类型仍为单AZ。 input.AvailableZone = "3az" // 创建桶 output, err := obsClient.CreateBucket(input) if err == nil { fmt.Printf("Create bucket:%s successful!\n", input.Bucket) fmt.Printf("RequestId:%s\n", output.RequestId) return } fmt.Printf("Create 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) } }
  • 接口约束 您必须拥有obs:bucket:CreateBucket权限,才能创建桶。建议使用IAM进行授权,配置方式详见使用IAM自定义策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 创建桶时,如果初始化客户端使用的终端节点(endPoint)为“obs.myhuaweicloud.com”,则可以不指定桶所在区域(location),系统会自动在华北-北京一(cn-north-1)创建桶;如果初始化客户端使用的终端节点(endPoint)不是obs.myhuaweicloud.com,则必须指定桶所在区域(location),且指定的区域必须与终端节点(endPoint)区域一致,否则会返回状态码400。 比如初始化时使用的终端节点endPoint是obs.cn-north-4. myhuaweicloud.com,那么在创建桶的时候必须指定Location:cn-north-4 才会创建成功,否则会返回状态码400。 同一账号下,可以创建多个存桶,数量上限是100个(不区分地域),存储桶中的对象数量和大小没有限制。 新创建桶的桶名在OBS中必须是唯一的。如果是同一个用户重复创建同一区域的同名桶时返回HTTP状态码200。除此以外的其他场景重复创建同名桶返回HTTP状态码409,表明桶已存在。 用户删除桶后,需要等待30分钟才能创建同名桶和并行文件系统。 并不是所有区域都支持创建多AZ桶,你可以在产品价格详情页面,查询指定区域是否支持多AZ。
  • 代码示例 本示例用于批量删除examplebucket桶中的key1、key2、key3对象 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 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.DeleteObjectsInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定删除列表 var objects [3]obs.ObjectToDelete objects[0] = obs.ObjectToDelete{Key: "key1", VersionId: ""} objects[1] = obs.ObjectToDelete{Key: "key2", VersionId: ""} objects[2] = obs.ObjectToDelete{Key: "key3", VersionId: ""} input.Objects = objects[:] // 批量删除对象 output, err := obsClient.DeleteObjects(input) if err == nil { fmt.Printf("Delete objects under the bucket(%s) successful!\n", input.Bucket) for index, deleted := range output.Deleteds { fmt.Printf("Deleted[%d]-Key:%s, VersionId:%s\n", index, deleted.Key, deleted.VersionId) } for index, err := range output.Errors { fmt.Printf("Error[%d]-Key:%s, Code:%s\n", index, err.Key, err.Code) } return } fmt.Printf("Delete 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) } }
  • 返回结果说明 表4 返回结果 参数名称 参数类型 描述 output *DeleteObjectsOutput 参数解释: 接口返回信息,详情参考DeleteObjectsOutput。 err error 参数解释: 接口返回错误信息。 表5 DeleteObjectsOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 Deleteds []Deleted 参数解释: 删除成功的对象列表,详见Deleted。 Errors []Error 参数解释: 删除失败的对象列表,详见Error。 EncodingType string 参数解释: 用于指定对响应中的Key进行指定类型的编码。如果Key包含xml 1.0标准不支持的控制字符,可通过设置该参数对响应中的Key进行编码。 取值范围: 可选值为url。 默认取值: 无,不设置则不编码。 表6 Deleted 参数名称 参数类型 描述 Key string 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 VersionId string 参数解释: 对象的版本号,用于删除指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认删除最新版本的对象。 DeleteMarker bool 参数解释: 标识删除的对象是否是删除标记。 取值范围: true:是删除标记。 false:不是删除标记。 默认取值: false DeleteMarkerVersionId string 参数解释: 请求创建或删除的删除标记版本号。 当批量删除请求访问的桶是多版本桶时,如果创建或删除一个删除标记,响应消息会返回该元素。该元素在以下两种情况中会出现: 用户发送不带版本删除请求,即请求只有对象名,无版本号。这种情况下,系统会创建一个删除标记,并在响应中返回该删除标记的版本号。 用户发送带版本删除请求,即请求同时包含对象名以及版本号,但是该版本号标识一个删除标记。这种情况下,系统会删除此删除标记,并在响应中返回该删除标记的版本号。 默认取值: 无 表7 Error 参数名称 参数类型 描述 Key string 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 VersionId string 参数解释: 对象的版本号,用于删除指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认删除最新版本的对象。 Code string 参数解释: 删除失败的错误码。可参考OBS错误码。 Message string 参数解释: 删除失败的错误原因。可参考OBS错误码。
  • 接口约束 您必须是桶拥有者或拥有批量删除对象的权限,才能批量删除对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:DeleteObject权限,如果使用桶策略则需授予DeleteObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 桶没有开启多版本控制功能时,已删除的对象不可恢复,请谨慎操作。 批量删除对象一次能接收最大对象数目为1000个,如果超出限制,服务端会返回请求不合法。 并发任务分配后,在循环删除多个对象过程中, 如果发生内部错误, 有可能出现数据不一致的情况(某个对象索引数据删除但还有元数据)。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *DeleteObjectsInput 必选 参数解释: 批量删除对象请求参数,详情参考DeleteObjectsInput。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参考extensionOptions。 表2 DeleteObjectsInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Quiet bool 可选 参数解释: 批量删除对象的响应方式。 取值范围: false:表示详细模式,返回删除成功和删除失败的所有结果; true:表示简单模式,只返回删除过程中出错的结果。 默认取值: false Objects []ObjectToDelete 必选 参数解释: 待删除的对象列表,详情参考ObjectToDelete。 EncodingType string 可选 参数解释: 用于指定对响应中的Key进行指定类型的编码。如果Key包含xml 1.0标准不支持的控制字符,可通过设置该参数对响应中的Key进行编码。 取值范围: 可选值为url。 默认取值: 无,不设置则不编码。 表3 ObjectToDelete 参数名称 参数类型 是否必选 描述 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 VersionId string 可选 参数解释: 对象的版本号,用于删除指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认删除最新版本的对象。
  • 可用的拓展请求头 创建方式 说明 WithTrafficLimitHeader(trafficLimit int64) 配置在请求中携带单链接限速头域。目前仅支持 GetObject 方法。 取值范围:819200 ~ 838860800,单位:bit/s。 表1 PayerType 常量名 原始值 说明 BucketOwnerPayer BucketOwner 表示桶拥有者支付所有费用。 RequesterPayer Requester 表示请求者支付流量和请求次数费用,桶拥有者支付存储费用。
  • 返回结果说明 表3 返回结果 参数名称 参数类型 描述 output *DeleteObjectOutput 参数解释: 接口返回信息,详情参考DeleteObjectOutput。 err error 参数解释: 接口返回错误信息。 表4 DeleteObjectOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 DeleteMarker bool 参数解释: 标识删除的对象是否是删除标记。 取值范围: true:是删除标记。 false:不是删除标记。 默认取值: false VersionId string 参数解释: 对象的版本号,用于删除指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认删除最新版本的对象。
  • 代码示例 本示例用于删除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 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.DeleteObjectInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定删除对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 删除对象 output, err := obsClient.DeleteObject(input) if err == nil { fmt.Printf("Delete object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket) fmt.Printf("RequestId:%s\n", output.RequestId) return } fmt.Printf("Delete 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) } }
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *DeleteObjectInput 必选 删除对象请求参数。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参考extensionOptions。 表2 DeleteObjectInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 必选 参数解释: 目标对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 VersionId string 可选 参数解释: 对象的版本号,用于删除指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认删除最新版本的对象。
  • 代码示例 本示例用于初始化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 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.InitiateMultipartUploadInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定对象名,此处以 example/objectname 为例。 input.Key = "example/objectname" // 初始化上传段任务 output, err := obsClient.InitiateMultipartUpload(input) if err == nil { fmt.Printf("Initiate multipart upload successful with bucket(%s) and object(%s)!\n", input.Bucket, input.Key) fmt.Printf("UploadId:%s\n", output.UploadId) return } fmt.Printf("Initiate multipart upload fail with bucket(%s) and object(%s)!\n", input.Bucket, input.Key) 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) } }
  • 功能说明 使用多段上传特性时,用户必须首先调用创建多段上传任务接口创建任务,系统会给用户返回一个全局唯一的多段上传任务号,作为任务标识。后续用户可以根据这个标识发起相关的请求,如:上传段、合并段、列举段等。创建多段上传任务不影响已有的同名对象;同一个对象可以同时存在多个多段上传任务;每个多段上传任务在初始化时可以附加消息头信息,包括acl、用户自定义元数据和通用的HTTP消息头contentType、contentEncoding等,这些附加的消息头信息将先记录在多段上传任务元数据中。 在指定桶中初始化分段上传任务。
  • 接口约束 您必须是桶拥有者或拥有初始化分段上传任务的权限,才能初始化分段上传任务。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,才能停止收取已上传的段的存储费用。仅当在合并段或取消多段上传任务之后,OBS才释放段存储并停止向您收取段存储费用。
  • 返回结果说明 表7 返回结果 参数名称 参数类型 描述 output *InitiateMultipartUploadOutput 参数解释: 接口返回信息。详情参见InitiateMultipartUploadOutput。 err error 参数解释: 接口返回错误信息。 表8 InitiateMultipartUploadOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 Bucket string 参数解释: 分段上传任务的桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 参数解释: 分段上传任务的对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 UploadId string 参数解释: 分段上传任务的ID,例如:000001648453845DBB78F2340DD460D8 取值范围: 长度大于0且不超过32的字符串。 默认取值: 无 SseHeader SseCHeader 或 SseKmsHeader 参数解释: 服务端加密头信息。SSE-C加密方式详情参见SseCHeader,SSE-KMS加密方式详情参见SseKmsHeader。 EncodingType string 参数解释: 用于指定对响应中的Key进行指定类型的编码。如果Key包含xml 1.0标准不支持的控制字符,可通过设置该参数对响应中的Key进行编码。 取值范围: 可选值为url。 默认取值: 无,不设置则不编码。 表9 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== 默认取值: 无 表10 SseKmsHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 Key string 作为请求参数时可选 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式: regionID:domainID(账号ID):key/key_id key_id 其中: regionID是使用密钥所属region的ID,可在地区和终端节点页面获取; domainID是使用密钥所属账号的账号ID,获取方法参见如何获取账号ID和用户ID?; key_id是从数据加密服务创建的密钥ID,获取方法请参见查看密钥。 默认取值: 如果用户没有提供该头域,那么默认的主密钥将会被使用。 如果默认主密钥不存在,将默认创建并使用。
共100000条