本文介绍如何设置对象标签(Object Tagging)。

对象标签使用一组键值对(Key-Value)来标记对象。对象标签的详情请参考开发指南的对象标签

说明
  • 您可以在上传Object时设置对象标签,也可以对已上传Object设置对象标签。设置对象标签时,若对象已有标签,则覆盖原标签。设置对象标签的详情请参考PutObjectTagging
  • 设置对象标签时要求请求者有PutObjectTagging权限。
  • 更改标签时不会更新Object的Last‑Modified时间。
  • 标签合法字符集包括大小写字母、数字、空格和以下符号:

    +‑=._:/

上传Object时添加对象标签

  • 简单上传时添加对象标签
    以下代码用于简单上传时添加对象标签:
    package main
    
    import (
      "fmt"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 设置Tagging规则。 
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      // 设置Object Tagging。
      err = bucket.PutObject("<yourObjectKey>", strings.NewReader("<yourObjectValue>"), oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }
  • 分片上传时添加对象标签
    以下代码用于分片上传时添加对象标签:
    package main
    
    import (
      "fmt"
      "os"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
        // 设置Tagging规则。 
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      // 获取待上传的文件位置和名称。
      fileName := "<youFileNameAndPath>"
    
      // 将文件分成3个分片进行上传,具体分片数可以试文件大小而定。
      chunks, err := oss.SplitFileByPartNum(fileName, 3)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 打开文件。
      fd, err := os.Open(fileName)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      defer fd.Close()
    
      // 初始化上传的文件,并设置tagging。
      imur, err := bucket.InitiateMultipartUpload("<yourObjectName>", oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 分片上传。
      var parts []oss.UploadPart
      for _, chunk := range chunks {
        fd.Seek(chunk.Offset, os.SEEK_SET)
        part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
        if err != nil {
          fmt.Println("Error:", err)
          os.Exit(-1)
        }
        parts = append(parts, part)
      }
      _, err = bucket.CompleteMultipartUpload(imur, parts)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }
  • 追加上传时添加对象标签
    以下代码用于追加上传时添加对象标签:
    package main
    
    import (
      "fmt"
      "os"
      "strings"
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
        // 设置Tagging规则。 
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      var nextPos int64
      // 第一次上传可追加的文件。只有第一次调用AppendObject设置的标签才会生效,后续再调用AppendObject设置的标签不生效。
      nextPos, err = bucket.AppendObject("<yourObjectName>", strings.NewReader("<yourObjectValue>"), nextPos, oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      // 第二次上传。
      nextPos, err = bucket.AppendObject("<yourObjectName>", strings.NewReader("<yourObjectAppandValue>"), nextPos)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }
  • 断点续传上传时添加对象标签
    以下代码用于断点续传上传时添加对象标签:
    package main
    
    import (
      "fmt"
      "os"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
        // 设置Tagging规则。
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      // 将文件分成多个分片,每个分片大小为100KB,使用3个协程并发上传分片,上传时设置Object Tagging。
      err = bucket.UploadFile("<yourObjectName>", "<yourNeedPuttingFile>", 100*1024, oss.Routines(3), oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }

对已上传Object添加或更改对象标签

以下代码用于对已上传Object添加或更改对象标签:
package main

import (
  "fmt"
  "os"
  "strings"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
  // 创建OSSClient实例。
  client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 获取存储空间。
  bucket, err := client.Bucket("<yourBucketName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 设置Tagging规则。 
  tag1 := oss.Tag{
    Key:   "key1",
    Value: "value1",
  }
  tag2 := oss.Tag{
    Key:   "key2",
    Value: "value2",
  }
  tagging := oss.Tagging{
    Tags: []oss.Tag{tag1, tag2},
  }
  // 设置Object Tagging。
  err = bucket.PutObjectTagging("<yourObjectName>", tagging)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}

拷贝Object时设置对象标签

拷贝Object时,可以指定如何设置目标Object的对象标签。取值如下:
  • Copy(默认值):复制源Object的对象标签到目标 Object。
  • Replace:忽略源Object的对象标签,直接采用请求中指定的对象标签。

以下分别提供了简单拷贝1GB以下的Object、及分片拷贝1GB以上的Object时设置对象标签的详细示例。

  • 以下代码用于简单拷贝1GB以下的Object时设置对象标签:
    package main
    
    import (
      "fmt"
      "os"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
        // 设置Tagging规则。 
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      // 复制object时只设置tagging参数,Object Tagging不生效。
      _, err = bucket.CopyObject("<yourSourceObjectName>", "<yourDirectObjectName>", oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 复制object时需同时设置TaggingReplace及tagging两个参数,Object Tagging才生效。
      _, err = bucket.CopyObject("<yourSourceObjectName>", "<yourDirectObjectName>", oss.SetTagging(tagging), oss.TaggingDirective(oss.TaggingReplace))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }
  • 以下代码用于分片拷贝1GB以上的Object时设置对象标签:
    package main
    
    import (
      "fmt"
      "os"
      "strings"
    
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
      // 创建OSSClient实例。
      client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 获取存储空间。
      bucket, err := client.Bucket("<yourBucketName>")
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
        // 设置Tagging规则。
      tag1 := oss.Tag{
        Key:   "key1",
        Value: "value1",
      }
      tag2 := oss.Tag{
        Key:   "key2",
        Value: "value2",
      }
      tagging := oss.Tagging{
        Tags: []oss.Tag{tag1, tag2},
      }
    
      // 上传一个object,用于分片拷贝。
      content := "this your object value"
      err = bucket.PutObject("<yourObjectName>", strings.NewReader(content))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    
      // 初始化上传的文件,文件名是<desObjectName>,并设置tagging。
      imur, err := bucket.InitiateMultipartUpload("<desObjectName>", oss.SetTagging(tagging))
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      // yourSourObject表示拷贝的源Object。将Object分成1个分片进行上传。
      part, err := bucket.UploadPartCopy(imur, "<yourBucketName>", "<yourSourObject>", 0, int64(len(content)), 1)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
      parts := []oss.UploadPart{part}
      _, err = bucket.CompleteMultipartUpload(imur, parts)
      if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
      }
    }

为软链接文件设置标签

以下代码用于为软链接文件设置标签:
package main

import (
  "fmt"
  "os"
  "strings"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
  // 创建OSSClient实例。
  client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 获取存储空间。
  bucket, err := client.Bucket("<yourBucketName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

    // 设置Tagging规则。 
  tag1 := oss.Tag{
    Key:   "key1",
    Value: "value1",
  }
  tag2 := oss.Tag{
    Key:   "key2",
    Value: "value2",
  }
  tagging := oss.Tagging{
    Tags: []oss.Tag{tag1, tag2},
  }

  err = bucket.PutObject("<yourObjectName>", strings.NewReader("<yourObjectValue>"))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  err = bucket.PutSymlink("<yourObjectName>", "<yourObjectSymLinkName>", oss.SetTagging(tagging))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}