全部产品
阿里云办公

管理文件

更新时间:2018-08-20 10:31:54

您可以通过一系列的接口管理存储空间(Bucket)下的文件(Object),包括以下操作:

判断文件是否存在

以下代码用于判断指定的文件是否存在:

  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. // 获取存储空间。
  15. bucket, err := client.Bucket("<yourBucketName>")
  16. if err != nil {
  17. fmt.Println("Error:", err)
  18. os.Exit(-1)
  19. }
  20. // 判断文件是否存在。
  21. isExist, err := bucket.IsObjectExist("<yourObjectName>")
  22. if err != nil {
  23. fmt.Println("Error:", err)
  24. os.Exit(-1)
  25. }
  26. fmt.Println("Exist:", isExist)
  27. }

管理文件访问权限

文件的访问权限(ACL)有以下四种:

访问权限 描述 访问权限值
继承Bucket 文件遵循存储空间的访问权限。 oss.ACLDefault
私有 文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。 oss.ACLPrivate
公共读 文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。 oss.ACLPublicRead
公共读写 所有用户都有该文件的读写权限。请谨慎使用该权限。 oss.PublicReadWrite

文件的访问权限优先级高于存储空间的访问权限。例如存储空间的访问权限是私有,而文件的访问权限是公共读写,则所有用户都有该文件的读写权限。如果某个文件没有设置过访问权限,则遵循存储空间的访问权限。

文件访问权限的完整示例代码请参见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. // 获取存储空间。
  15. bucket, err := client.Bucket("<yourBucketName>")
  16. if err != nil {
  17. fmt.Println("Error:", err)
  18. os.Exit(-1)
  19. }
  20. // 设置文件的访问权限。
  21. err = bucket.SetObjectACL("<yourObjectName>", oss.ACLPublicReadWrite)
  22. if err != nil {
  23. fmt.Println("Error:", err)
  24. os.Exit(-1)
  25. }
  26. // 获取文件的访问权限。
  27. aclRes, err := bucket.GetObjectACL("<yourObjectName>")
  28. if err != nil {
  29. fmt.Println("Error:", err)
  30. os.Exit(-1)
  31. }
  32. fmt.Println("Object ACL:", aclRes.ACL)
  33. }

管理文件元信息

文件元信息(Object Meta)详情请参见开发指南中的文件元信息。 文件元信息的完整代码请参见GitHub

设置文件元信息

您可以在上传文件时设置文件元信息。可设置的文件元信息如下:

参数 说明
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. "strings"
  7. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  8. )
  9. func main() {
  10. // 创建OSSClient实例。
  11. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  12. if err != nil {
  13. fmt.Println("Error:", err)
  14. os.Exit(-1)
  15. }
  16. // 获取存储空间。
  17. bucket, err := client.Bucket("<yourBucketName>")
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 设置文件元信息:过期时间为2049年1月10日 23:00:00 GMT,访问权限为公共读,自定义元信息为MyProp(取值MyPropVal)
  23. expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
  24. options := []oss.Option{
  25. oss.Expires(expires),
  26. oss.ObjectACL(oss.ACLPublicRead),
  27. oss.Meta("MyProp", "MyPropVal"),
  28. }
  29. // 使用数据流上传文件。
  30. err = bucket.PutObject("<yourObjectName>", strings.NewReader("MyObjectValue"), options...)
  31. if err != nil {
  32. fmt.Println("Error:", err)
  33. os.Exit(-1)
  34. }
  35. // 获取文件元信息。
  36. props, err := bucket.GetObjectDetailedMeta("<yourObjectName>")
  37. if err != nil {
  38. fmt.Println("Error:", err)
  39. os.Exit(-1)
  40. }
  41. fmt.Println("Object Meta:", props)
  42. }

修改文件元信息

您可以一次修改一条或多条元信息,代码如下:

  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. // 获取存储空间。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 一次修改一条元信息。
  23. err = bucket.SetObjectMeta(objectName, oss.Meta("MyMeta", "MyMetaValue1"))
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. // 一次修改多条元信息。
  29. options := []oss.Option{
  30. oss.Meta("MyMeta", "MyMetaValue2"),
  31. oss.Meta("MyObjectLocation", "HangZhou"),
  32. }
  33. err = bucket.SetObjectMeta(objectName, options...)
  34. if err != nil {
  35. fmt.Println("Error:", err)
  36. os.Exit(-1)
  37. }
  38. // 获取文件元信息。
  39. props, err := bucket.GetObjectDetailedMeta(objectName)
  40. if err != nil {
  41. fmt.Println("Error:", err)
  42. os.Exit(-1)
  43. }
  44. fmt.Println("Object Meta:", props)
  45. }

获取文件元信息

以下代码用于获取文件元信息:

  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. // 获取存储空间。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 获取文件元信息。
  23. props, err := bucket.GetObjectDetailedMeta(objectName)
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. fmt.Println("Object Meta:", props)
  29. }

列举文件

OSS文件按照字母顺序排列。您可以通过Bucket.ListObjects列出存储空间下的文件。主要的参数如下:

参数 说明
delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。
prefix 限定返回的文件必须以prefix作为前缀。
maxKeys 限定此次列举文件的最大个数。默认值为100,最大值为1000。
marker 列举指定marker之后的文件。

ListObjects的完整代码请参见Github。>

简单列举文件

您可以使用默认参数获取存储空间的文件列表,默认返回100条记录。代码如下:

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 简单列举文件。
  22. lsRes, err := bucket.ListObjects()
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 打印结果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列举指定个数的文件

以下代码用于列举指定个数的文件:

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 设置列举文件的最大个数,并列举文件。
  22. lsRes, err := bucket.ListObjects(oss.MaxKeys(200))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 打印结果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列举指定前缀的文件

以下代码用于列举包含指定前缀(prefix)的文件:

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 列举包含指定前缀的文件。默认列举100个文件。
  22. lsRes, err := bucket.ListObjects(oss.Prefix("my-object-"))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 打印结果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列举指定marker之后的文件

参数marker代表文件名称。以下代码用于列举指定marker之后的文件:

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 列举指定marker之后的文件。默认列举100个文件。
  22. lsRes, err := bucket.ListObjects(oss.Marker("my-object-xx"))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 打印结果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

分页列举所有文件

以下代码用于分页列举指定存储空间下的所有文件。每页列举的文件个数通过maxKeys指定。

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分页列举所有文件。每页列举200个。
  22. marker := oss.Marker("")
  23. for {
  24. lsRes, err := bucket.ListObjects(oss.MaxKeys(200), marker)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. marker = oss.Marker(lsRes.NextMarker)
  30. fmt.Println("Objects:", lsRes.Objects)
  31. if !lsRes.IsTruncated {
  32. break
  33. }
  34. }
  35. }

分页列举指定marker之后的文件

以下代码用于分页列举指定maker之后的文件。每页列举的文件个数通过maxKeys指定。

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分页列举指定maker之后的文件。每页列举200个。
  22. marker = oss.Marker("my-object-xx")
  23. for {
  24. lsRes, err := bucket.ListObjects(oss.MaxKeys(50), marker)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. marker = oss.Marker(lsRes.NextMarker)
  30. fmt.Println("Objects:", lsRes.Objects)
  31. if !lsRes.IsTruncated {
  32. break
  33. }
  34. }
  35. }

分页列举指定前缀的文件

以下代码用于分页列举包含指定前缀的文件。每页列举的文件个数通过maxKeys指定。

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分页列举包含指定前缀的文件。每页列举80个。
  22. prefix := oss.Prefix("my-object-")
  23. marker := oss.Marker("")
  24. for {
  25. lsRes, err := bucket.ListObjects(oss.MaxKeys(80), marker, prefix)
  26. if err != nil {
  27. fmt.Println("Error:", err)
  28. os.Exit(-1)
  29. }
  30. prefix = oss.Prefix(lsRes.Prefix)
  31. marker = oss.Marker(lsRes.NextMarker)
  32. fmt.Println("Objects:", lsRes.Objects)
  33. if !lsRes.IsTruncated {
  34. break
  35. }
  36. }
  37. }

删除文件

请您谨慎使用删除操作,文件一旦删除将无法恢复。

删除文件的完整代码请参见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. // 获取存储空间。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 删除单个文件。
  23. err = bucket.DeleteObject(objectName)
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. }

删除多个文件

您可以通过Bucket.DeleteObjects来删除多个文件,并通过DeleteObjectsQuiet参数来指定是否返回删除的结果。默认返回删除成功的文件。

以下代码用于批量删除文件:

  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. // 获取存储空间。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 返回删除成功的文件。
  22. delRes, err := bucket.DeleteObjects([]string{"my-object-1", "my-object-2"})
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. fmt.Println("Deleted Objects:", delRes.DeletedObjects)
  28. // 不返回删除的结果。
  29. _, err = bucket.DeleteObjects([]string{"my-object-3", "my-object-4"},
  30. oss.DeleteObjectsQuiet(true))
  31. if err != nil {
  32. fmt.Println("Error:", err)
  33. os.Exit(-1)
  34. }
  35. }

拷贝文件

拷贝文件的完整代码请参见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:使用指定的元信息覆盖源文件的元信息。

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. }
本文导读目录