复制对象

更新时间: 2019-03-14 10:05

复制对象特性用来为OBS上已经存在的对象创建一个副本。

您可以通过ObsClient.copyObject来复制对象。复制对象时,可重新指定新对象的属性和设置对象权限,且支持条件复制。

复制对象 - 图1 说明:

  • 如果待复制的源对象是归档存储类型,则必须先取回源对象才能进行复制。

简单复制

以下代码展示了如何进行简单复制:

  1. // 引入依赖包
  2. import (
  3. "fmt"
  4. "obs"
  5. )
  6.  
  7. var ak = "*** Provide your Access Key ***"
  8. var sk = "*** Provide your Secret Key ***"
  9. var endpoint = "https://your-endpoint"
  10.  
  11. // 创建ObsClient结构体
  12. var obsClient, _ = obs.New(ak, sk, endpoint)
  13.  
  14. func main() {
  15. input := &obs.CopyObjectInput{}
  16. input.Bucket = "destbucketname"
  17. input.Key = "destobjectkey"
  18. input.CopySourceBucket = "sourcebucketname"
  19. input.CopySourceKey = "sourceobjectkey"
  20.  
  21. output, err := obsClient.CopyObject(input)
  22. if err == nil {
  23. fmt.Printf("RequestId:%s\n", output.RequestId)
  24. } else if obsError, ok := err.(obs.ObsError); ok {
  25. fmt.Printf("Code:%s\n", obsError.Code)
  26. fmt.Printf("Message:%s\n", obsError.Message)
  27. }
  28. }

重写对象属性

以下代码展示了如何在复制对象时重写对象属性:

  1. // 引入依赖包
  2. import (
  3. "fmt"
  4. "obs"
  5. )
  6.  
  7. var ak = "*** Provide your Access Key ***"
  8. var sk = "*** Provide your Secret Key ***"
  9. var endpoint = "https://your-endpoint"
  10.  
  11. // 创建ObsClient结构体
  12. var obsClient, _ = obs.New(ak, sk, endpoint)
  13.  
  14. func main() {
  15. input := &obs.CopyObjectInput{}
  16. input.Bucket = "destbucketname"
  17. input.Key = "destobjectkey"
  18. input.CopySourceBucket = "sourcebucketname"
  19. input.CopySourceKey = "sourceobjectkey"
  20. // 设置进行对象属性重写
  21. input.MetadataDirective = obs.ReplaceMetadata
  22. input.ContentType = "image/jpg"
  23. input.StorageClass = obs.StorageClassWarm
  24.  
  25. // 重写自定义元数据
  26. input.Metadata = map[string]string{"property": "property-value"}
  27.  
  28. output, err := obsClient.CopyObject(input)
  29. if err == nil {
  30. fmt.Printf("RequestId:%s\n", output.RequestId)
  31. } else if obsError, ok := err.(obs.ObsError); ok {
  32. fmt.Printf("Code:%s\n", obsError.Code)
  33. fmt.Printf("Message:%s\n", obsError.Message)
  34. }
  35. }

复制对象 - 图2 说明:

使用CopyObjectInput.Metadata指定待重写的自定义对象属性;使用CopyObjectInput.MetadataDirective指定重写选项,支持ReplaceMetadata(重写)和CopyMetadata(从源对象复制)两个枚举值。

限定条件复制

复制对象时,可以指定一个或多个限定条件,满足限定条件时则进行复制,否则返回异常码,复制对象失败。

您可以使用的限定条件如下:


参数

作用

CopyObjectInput.CopySourceIfModifiedSince

如果源对象的修改时间晚于该参数值指定的时间,则进行复制,否则返回错误。

CopyObjectInput.CopySourceIfUnmodifiedSince

如果源对象的修改时间早于该参数值指定的时间,则进行复制,否则返回错误。

CopyObjectInput.CopySourceIfMatch

如果源对象的ETag值与该参数值相同,则进行复制,否则返回错误。

CopyObjectInput.CopySourceIfNoneMatch

如果源对象的ETag值与该参数值不相同,则进行复制,否则返回错误。

复制对象 - 图3 说明:

  • 源对象的ETag值是指源对象数据的MD5校验值。
  • 如果包含CopySourceIfUnmodifiedSince并且不符合,或者包含CopySourceIfMatch并且不符合,或者包含CopySourceIfModifiedSince并且不符合,或者包含CopySourceIfNoneMatch并且不符合,则复制对象失败,返回异常码:412 precondition failed。
  • CopySourceIfModifiedSince和CopySourceIfNoneMatch可以一起使用;CopySourceIfUnmodifiedSince和CopySourceIfMatch可以一起使用。

以下代码展示了如何进行限定条件复制:

  1. // 引入依赖包
  2. import (
  3. "fmt"
  4. "obs"
  5. "time"
  6. )
  7.  
  8. var ak = "*** Provide your Access Key ***"
  9. var sk = "*** Provide your Secret Key ***"
  10. var endpoint = "https://your-endpoint"
  11.  
  12. // 创建ObsClient结构体
  13. var obsClient, _ = obs.New(ak, sk, endpoint)
  14.  
  15. func main() {
  16. input := &obs.CopyObjectInput{}
  17. input.Bucket = "destbucketname"
  18. input.Key = "destobjectkey"
  19. input.CopySourceBucket = "sourcebucketname"
  20. input.CopySourceKey = "sourceobjectkey"
  21.  
  22. format := "2006/01/02 15:04:05"
  23. t, _ := time.Parse(format, "2015/12/31 00:00:00")
  24. input.CopySourceIfNoneMatch = "none-match-etag"
  25. input.CopySourceIfModifiedSince = t
  26.  
  27. output, err := obsClient.CopyObject(input)
  28. if err == nil {
  29. fmt.Printf("RequestId:%s\n", output.RequestId)
  30. } else if obsError, ok := err.(obs.ObsError); ok {
  31. fmt.Printf("Code:%s\n", obsError.Code)
  32. fmt.Printf("Message:%s\n", obsError.Message)
  33. }
  34. }

重写对象访问权限

以下代码展示了如何在复制对象时重写对象访问权限:

  1. // 引入依赖包
  2. import (
  3. "fmt"
  4. "obs"
  5. )
  6.  
  7. var ak = "*** Provide your Access Key ***"
  8. var sk = "*** Provide your Secret Key ***"
  9. var endpoint = "https://your-endpoint"
  10.  
  11. // 创建ObsClient结构体
  12. var obsClient, _ = obs.New(ak, sk, endpoint)
  13.  
  14. func main() {
  15. input := &obs.CopyObjectInput{}
  16. input.Bucket = "destbucketname"
  17. input.Key = "destobjectkey"
  18. input.CopySourceBucket = "sourcebucketname"
  19. input.CopySourceKey = "sourceobjectkey"
  20. // 复制时重写对象访问权限为公共读
  21. input.ACL = obs.AclPublicRead
  22.  
  23. output, err := obsClient.CopyObject(input)
  24. if err == nil {
  25. fmt.Printf("RequestId:%s\n", output.RequestId)
  26. } else if obsError, ok := err.(obs.ObsError); ok {
  27. fmt.Printf("Code:%s\n", obsError.Code)
  28. fmt.Printf("Message:%s\n", obsError.Message)
  29. }
  30. }

父主题:管理对象