本文介绍如何拷贝文件。

拷贝文件的完整代码请参见GitHub

同一存储空间内拷贝文件

以下代码用于在同一个存储空间内拷贝文件:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 创建OSSClient实例。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. objectName := "<yourObjectName>"
  16. destObjectName := "<yourDestObjectName>"
  17. // 获取存储空间。
  18. bucket, err := client.Bucket(bucketName)
  19. if err != nil {
  20. fmt.Println("Error:", err)
  21. os.Exit(-1)
  22. }
  23. // 拷贝文件到同一个存储空间的另一个文件。
  24. _, err = bucket.CopyObject(objectName, destObjectName)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. }

跨存储空间拷贝文件

您可以将其它存储空间的文件拷贝到当前存储空间,也可以将当前存储空间的文件拷贝到其它存储空间。代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 创建OSSClient实例。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. srcBucketName := "<yourSrcBucketName>"
  16. dstBucketName := "<yourDstBucketName>"
  17. srcObjectName := "<yourSrcObjectName>"
  18. dstObjectName := "<yourDstObjectName>"
  19. // 获取存储空间。
  20. bucket, err := client.Bucket(bucketName)
  21. if err != nil {
  22. fmt.Println("Error:", err)
  23. os.Exit(-1)
  24. }
  25. // 从其它存储空间(srcBucketName)拷贝源文件(srcObjectName)到本存储空间。
  26. bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
  27. if err != nil {
  28. fmt.Println("CopyObjectFrom Error:", err)
  29. os.Exit(-1)
  30. }
  31. // 从本存储空间拷贝源文件(srcObjectName)到其它存储空间(dstBucketName)。
  32. bucket.CopyObjectTo(dstBucketName, dstObjectName, srcObjectName)
  33. if err != nil {
  34. fmt.Println("CopyObjectTo Error:", err)
  35. os.Exit(-1)
  36. }
  37. }

拷贝时处理文件元信息

您可以在拷贝文件时通过MetadataDirective参数来处理文件元信息。MetadataDirective的取值如下:

  • oss.MetaCopy:默认值。目标文件的元信息与源文件的元信息相同,即拷贝源文件的元信息。
  • oss.MetaReplace:使用指定的元信息覆盖源文件的元信息。

注意 oss.MetaReplace将覆盖源文件的全部元信息,且无法恢复,请谨慎操作。

MetadataDirective取值为oss.MetaReplace时,可以指定的元信息如下:

参数说明
CacheControl指定目标文件被下载时的网页的缓存行为。
ContentDisposition指定目标文件被下载时的名称。
ContentEncoding指定目标文件被下载时的内容编码格式。
Expires设置缓存过期时间,格式是格林威治时间(GMT)。
ServerSideEncryption指定OSS创建目标文件时的服务器端加密编码算法。有效值:AES256。
ObjectACL指定OSS创建的目标文件的访问权限。
Meta自定义元信息,以X-Oss-Meta-为前缀的参数。

以下代码用于在拷贝时处理文件元信息:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func main() {
  9. // 创建OSSClient实例。
  10. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  11. if err != nil {
  12. fmt.Println("Error:", err)
  13. os.Exit(-1)
  14. }
  15. bucketName := "<yourBucketName>"
  16. objectName := "<yourObjectName>"
  17. destObjectName := "<yourDestObjectName>"
  18. // 获取存储空间。
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. fmt.Println("Error:", err)
  22. os.Exit(-1)
  23. }
  24. // 指定目标文件的元信息。
  25. expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
  26. options := []oss.Option{
  27. oss.MetadataDirective(oss.MetaReplace),
  28. oss.Expires(expires),
  29. oss.ObjectACL(oss.ACLPublicRead),
  30. oss.Meta("MyMeta", "MyMetaValue")}
  31. // 使用指定的元信息覆盖源文件的元信息。
  32. _, err = bucket.CopyObject(objectName, destObjectName, options...)
  33. if err != nil {
  34. fmt.Println("Error:", err)
  35. os.Exit(-1)
  36. }
  37. }

限定条件拷贝

拷贝文件时,可以指定一个或多个限定条件。满足限定条件则拷贝,不满足则返回错误,不拷贝。可以使用的限定条件如下:

参数说明
CopySourceIfMatch如果源文件的ETag和指定的ETag匹配,则执行拷贝操作;否则返回错误。
CopySourceIfNoneMatch如果源文件的ETag和指定的ETag不匹配,则执行拷贝操作;否则返回错误。
CopySourceIfModifiedSince如果指定的时间早于实际修改时间,则执行拷贝操作;否则返回错误。
CopySourceIfUnmodifiedSince如果指定的时间等于或者晚于文件实际修改时间,则执行拷贝操作;否则返回错误。

CopySourceIfMatch和CopySourceIfNoneMatch可以同时存在。CopySourceIfModifiedSince和CopySourceIfUnmodifiedSince可以同时存在。

以下代码用于限定条件拷贝:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func main() {
  9. // 创建OSSClient实例。
  10. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  11. if err != nil {
  12. fmt.Println("Error:", err)
  13. os.Exit(-1)
  14. }
  15. // bucketName := "<yourBucketName>"
  16. // objectName := "<yourObjectName>"
  17. bucketName := "<yourBucketName>"
  18. objectName := "<yourObjectName>"
  19. destMatchObjectName := "<yourMatchDestObjectName>"
  20. destUnMatchObjectName := "<yourUnmatchDestObjectName>"
  21. // 获取存储空间。
  22. bucket, err := client.Bucket(bucketName)
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. date := time.Date(2011, time.November, 10, 23, 0, 0, 0, time.UTC)
  28. // 满足限定条件,执行拷贝。
  29. _, err = bucket.CopyObject(objectName, destMatchObjectName, oss.CopySourceIfModifiedSince(date))
  30. if err != nil {
  31. fmt.Println("CopyObject CopySourceIfModifiedSince Error:", err)
  32. }
  33. // 不满足限定条件,不执行拷贝。
  34. _, err = bucket.CopyObject(objectName, destUnMatchObjectName, oss.CopySourceIfUnmodifiedSince(date))
  35. if err != nil {
  36. fmt.Println("CopyObject CopySourceIfUnmodifiedSince Error:", err)
  37. }
  38. }