复制对象
更新时间: 2019-03-14 10:05
复制对象特性用来为OBS上已经存在的对象创建一个副本。
您可以通过ObsClient.copyObject来复制对象。复制对象时,可重新指定新对象的属性和设置对象权限,且支持条件复制。
说明:
- 如果待复制的源对象是归档存储类型,则必须先取回源对象才能进行复制。
简单复制
以下代码展示了如何进行简单复制:
- // 引入依赖包
- import (
- "fmt"
- "obs"
- )
- var ak = "*** Provide your Access Key ***"
- var sk = "*** Provide your Secret Key ***"
- var endpoint = "https://your-endpoint"
- // 创建ObsClient结构体
- var obsClient, _ = obs.New(ak, sk, endpoint)
- func main() {
- input := &obs.CopyObjectInput{}
- input.Bucket = "destbucketname"
- input.Key = "destobjectkey"
- input.CopySourceBucket = "sourcebucketname"
- input.CopySourceKey = "sourceobjectkey"
- output, err := obsClient.CopyObject(input)
- if err == nil {
- fmt.Printf("RequestId:%s\n", output.RequestId)
- } else if obsError, ok := err.(obs.ObsError); ok {
- fmt.Printf("Code:%s\n", obsError.Code)
- fmt.Printf("Message:%s\n", obsError.Message)
- }
- }
重写对象属性
以下代码展示了如何在复制对象时重写对象属性:
- // 引入依赖包
- import (
- "fmt"
- "obs"
- )
- var ak = "*** Provide your Access Key ***"
- var sk = "*** Provide your Secret Key ***"
- var endpoint = "https://your-endpoint"
- // 创建ObsClient结构体
- var obsClient, _ = obs.New(ak, sk, endpoint)
- func main() {
- input := &obs.CopyObjectInput{}
- input.Bucket = "destbucketname"
- input.Key = "destobjectkey"
- input.CopySourceBucket = "sourcebucketname"
- input.CopySourceKey = "sourceobjectkey"
- // 设置进行对象属性重写
- input.MetadataDirective = obs.ReplaceMetadata
- input.ContentType = "image/jpg"
- input.StorageClass = obs.StorageClassWarm
- // 重写自定义元数据
- input.Metadata = map[string]string{"property": "property-value"}
- output, err := obsClient.CopyObject(input)
- if err == nil {
- fmt.Printf("RequestId:%s\n", output.RequestId)
- } else if obsError, ok := err.(obs.ObsError); ok {
- fmt.Printf("Code:%s\n", obsError.Code)
- fmt.Printf("Message:%s\n", obsError.Message)
- }
- }
说明:
使用CopyObjectInput.Metadata指定待重写的自定义对象属性;使用CopyObjectInput.MetadataDirective指定重写选项,支持ReplaceMetadata(重写)和CopyMetadata(从源对象复制)两个枚举值。
限定条件复制
复制对象时,可以指定一个或多个限定条件,满足限定条件时则进行复制,否则返回异常码,复制对象失败。
您可以使用的限定条件如下:
参数 | 作用 |
---|---|
CopyObjectInput.CopySourceIfModifiedSince | 如果源对象的修改时间晚于该参数值指定的时间,则进行复制,否则返回错误。 |
CopyObjectInput.CopySourceIfUnmodifiedSince | 如果源对象的修改时间早于该参数值指定的时间,则进行复制,否则返回错误。 |
CopyObjectInput.CopySourceIfMatch | 如果源对象的ETag值与该参数值相同,则进行复制,否则返回错误。 |
CopyObjectInput.CopySourceIfNoneMatch | 如果源对象的ETag值与该参数值不相同,则进行复制,否则返回错误。 |
说明:
- 源对象的ETag值是指源对象数据的MD5校验值。
- 如果包含CopySourceIfUnmodifiedSince并且不符合,或者包含CopySourceIfMatch并且不符合,或者包含CopySourceIfModifiedSince并且不符合,或者包含CopySourceIfNoneMatch并且不符合,则复制对象失败,返回异常码:412 precondition failed。
- CopySourceIfModifiedSince和CopySourceIfNoneMatch可以一起使用;CopySourceIfUnmodifiedSince和CopySourceIfMatch可以一起使用。
以下代码展示了如何进行限定条件复制:
- // 引入依赖包
- import (
- "fmt"
- "obs"
- "time"
- )
- var ak = "*** Provide your Access Key ***"
- var sk = "*** Provide your Secret Key ***"
- var endpoint = "https://your-endpoint"
- // 创建ObsClient结构体
- var obsClient, _ = obs.New(ak, sk, endpoint)
- func main() {
- input := &obs.CopyObjectInput{}
- input.Bucket = "destbucketname"
- input.Key = "destobjectkey"
- input.CopySourceBucket = "sourcebucketname"
- input.CopySourceKey = "sourceobjectkey"
- format := "2006/01/02 15:04:05"
- t, _ := time.Parse(format, "2015/12/31 00:00:00")
- input.CopySourceIfNoneMatch = "none-match-etag"
- input.CopySourceIfModifiedSince = t
- output, err := obsClient.CopyObject(input)
- if err == nil {
- fmt.Printf("RequestId:%s\n", output.RequestId)
- } else if obsError, ok := err.(obs.ObsError); ok {
- fmt.Printf("Code:%s\n", obsError.Code)
- fmt.Printf("Message:%s\n", obsError.Message)
- }
- }
重写对象访问权限
以下代码展示了如何在复制对象时重写对象访问权限:
- // 引入依赖包
- import (
- "fmt"
- "obs"
- )
- var ak = "*** Provide your Access Key ***"
- var sk = "*** Provide your Secret Key ***"
- var endpoint = "https://your-endpoint"
- // 创建ObsClient结构体
- var obsClient, _ = obs.New(ak, sk, endpoint)
- func main() {
- input := &obs.CopyObjectInput{}
- input.Bucket = "destbucketname"
- input.Key = "destobjectkey"
- input.CopySourceBucket = "sourcebucketname"
- input.CopySourceKey = "sourceobjectkey"
- // 复制时重写对象访问权限为公共读
- input.ACL = obs.AclPublicRead
- output, err := obsClient.CopyObject(input)
- if err == nil {
- fmt.Printf("RequestId:%s\n", output.RequestId)
- } else if obsError, ok := err.(obs.ObsError); ok {
- fmt.Printf("Code:%s\n", obsError.Code)
- fmt.Printf("Message:%s\n", obsError.Message)
- }
- }
父主题:管理对象