You need to enable JavaScript to run this app.
导航

管理对象元信息(Go SDK)

最近更新时间2024.02.04 18:30:55

首次发布时间2021.12.31 17:38:36

对象元信息是对象的属性描述,包括 HTTP 标准属性(HTTP Header)和用户自定义元数据(User Meta)两种。

注意事项

  • 只有对象拥有者,具备设置对象元数据权限。
  • 设置用户自定义元数据时,英文字母自定义元数据 Key 只支持小写,不支持空格等特殊字符。

参数说明

通过 TOS Go SDK 可以添加和修改已经上传对象的元数据信息。TOS 支持携带以下 7 个请求头来修改对象元数据,在下载对象或者 HEAD 对象时,这些值会设置到 HTTP 头域中返回给客户端。请求头如下所示:

名称

说明

Content-Type

对象类型

Cache-Control

指定该对象被下载时网页的缓存行为

Expires

RFC2616中定义的缓存失效时间

Content-Disposition

对象被下载时的名称

Content-Encoding

对象被下载时的内容编码类型

Content-Language

对象被下载时的内容语言格式

x-tos-meta-*

使用 SDK 设置 Meta 字段时设置的元数据信息。当查询此对象时,元数据将会在返回消息的 Header 中

示例代码

普通上传时设置元数据信息

package main

import (
   "context"
   "fmt"
   "strings"
   "time"

   "github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)

func checkErr(err error) {
   if err != nil {
      if serverErr, ok := err.(*tos.TosServerError); ok {
         fmt.Println("Error:", serverErr.Error())
         fmt.Println("Request ID:", serverErr.RequestID)
         fmt.Println("Response Status Code:", serverErr.StatusCode)
         fmt.Println("Response Header:", serverErr.Header)
         fmt.Println("Response Err Code:", serverErr.Code)
         fmt.Println("Response Err Msg:", serverErr.Message)
      } else if clientErr, ok := err.(*tos.TosClientError); ok {
         fmt.Println("Error:", clientErr.Error())
         fmt.Println("Client Cause Err:", clientErr.Cause.Error())
      } else {
         fmt.Println("Error:", err)
      }
      panic(err)
   }
}

func main() {
   var (
      accessKey = os.Getenv("TOS_ACCESS_KEY")
      secretKey = os.Getenv("TOS_SECRET_KEY")
      // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
      endpoint = "https://tos-cn-beijing.volces.com"
      region   = "cn-beijing"
      // 填写 BucketName
      bucketName = "*** Provide your bucket name ***"

      // 将文件上传到 example_dir 目录下的 example.txt 文件
      objectKey = "example_dir/example.txt"
      ctx       = context.Background()
   )
   // 初始化客户端
   client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
   checkErr(err)
   // 将字符串 “Hello TOS” 上传到指定 example_dir 目录下的 example.txt
   body := strings.NewReader("Hello TOS")
   output, err := client.PutObjectV2(ctx, &tos.PutObjectV2Input{
      PutObjectBasicInput: tos.PutObjectBasicInput{
         Bucket: bucketName,
         Key:    objectKey,
         // 用户自定义元数据信息
         Meta: map[string]string{"key": "value"},
         // 设置对象类型
         ContentType: "text/html",
         // 设置对象下载时内容语言格式
         ContentLanguage: "zh-cn",
         // 设置缓存策略
         CacheControl: "no-store",
         // 设置缓存过期时间
         Expires: time.Now().UTC().Add(time.Hour),
         // 设置下载内容下载时的名称
         ContentDisposition: "example.png",
         // 设置下载时编码类型
         ContentEncoding: "deflate",
      },
      Content: body,
   })
   checkErr(err)
   fmt.Println("PutObjectV2 Request ID:", output.RequestID)
}

分片上传设置元数据信息

package main

import (
   "context"
   "fmt"
   "strings"
   "time"

   "github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)

func checkErr(err error) {
   if err != nil {
      if serverErr, ok := err.(*tos.TosServerError); ok {
         fmt.Println("Error:", serverErr.Error())
         fmt.Println("Request ID:", serverErr.RequestID)
         fmt.Println("Response Status Code:", serverErr.StatusCode)
         fmt.Println("Response Header:", serverErr.Header)
         fmt.Println("Response Err Code:", serverErr.Code)
         fmt.Println("Response Err Msg:", serverErr.Message)
      } else if clientErr, ok := err.(*tos.TosClientError); ok {
         fmt.Println("Error:", clientErr.Error())
         fmt.Println("Client Cause Err:", clientErr.Cause.Error())
      } else {
         fmt.Println("Error:", err)
      }
      panic(err)
   }
}

func main() {
   var (
      accessKey = os.Getenv("TOS_ACCESS_KEY")
      secretKey = os.Getenv("TOS_SECRET_KEY")
      // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
      endpoint = "https://tos-cn-beijing.volces.com"
      region   = "cn-beijing"
      // 填写 BucketName
      bucketName = "*** Provide your bucket name ***"

      // 将文件上传到 example_dir 目录下的 example.txt 文件
      objectKey = "example_dir/example.txt"
      ctx       = context.Background()
   )
   // 初始化客户端
   client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
   checkErr(err)
   // 在创建分片时设置元数据信息
   output, err := client.CreateMultipartUploadV2(ctx, &tos.CreateMultipartUploadV2Input{

      Bucket: bucketName,
      Key:    objectKey,
      // 用户自定义元数据信息
      Meta: map[string]string{"key": "value"},
      // 设置对象类型
      ContentType: "text/html",
      // 设置对象下载时内容语言格式
      ContentLanguage: "zh-cn",
      // 设置缓存策略
      CacheControl: "no-store",
      // 设置缓存过期时间
      Expires: time.Now().UTC().Add(time.Hour),
      // 设置下载内容下载时的名称
      ContentDisposition: "example.png",
      // 设置下载时编码类型
      ContentEncoding: "deflate",
   })
   checkErr(err)
   fmt.Println("CreateMultipartUploadV2 Request ID:", output.RequestID)
   fmt.Println("CreateMultipartUploadV2 Upload ID:", output.UploadID)

   // 上传分片数据
   part, err := client.UploadPartV2(ctx, &tos.UploadPartV2Input{
      UploadPartBasicInput: tos.UploadPartBasicInput{
         Bucket:     bucketName,
         Key:        objectKey,
         UploadID:   output.UploadID,
         PartNumber: 1,
      },
      Content: strings.NewReader("your body data"),
   })
   checkErr(err)
   fmt.Println("UploadPartV2 Request ID:", part.RequestID)

   // 完成上传
   completeMultipartOutput, err := client.CompleteMultipartUploadV2(ctx, &tos.CompleteMultipartUploadV2Input{
      Bucket:   bucketName,
      Key:      objectKey,
      UploadID: output.UploadID,
      Parts: []tos.UploadedPartV2{{
         PartNumber: part.PartNumber,
         ETag:       part.ETag,
      }},
   })
   checkErr(err)
   fmt.Println("CompleteMultipartUploadV2 Request ID:", completeMultipartOutput.RequestID)
}

通过 SetObjectMeta 设置对象元数据信息

package main

import (
   "context"
   "fmt"
   "time"

   "github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)

func checkErr(err error) {
   if err != nil {
      if serverErr, ok := err.(*tos.TosServerError); ok {
         fmt.Println("Error:", serverErr.Error())
         fmt.Println("Request ID:", serverErr.RequestID)
         fmt.Println("Response Status Code:", serverErr.StatusCode)
         fmt.Println("Response Header:", serverErr.Header)
         fmt.Println("Response Err Code:", serverErr.Code)
         fmt.Println("Response Err Msg:", serverErr.Message)
      } else if clientErr, ok := err.(*tos.TosClientError); ok {
         fmt.Println("Error:", clientErr.Error())
         fmt.Println("Client Cause Err:", clientErr.Cause.Error())
      } else {
         fmt.Println("Error:", err)
      }
      panic(err)
   }
}

func main() {
   var (
      accessKey = os.Getenv("TOS_ACCESS_KEY")
      secretKey = os.Getenv("TOS_SECRET_KEY")
      // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
      endpoint = "https://tos-cn-beijing.volces.com"
      region   = "cn-beijing"
      // 填写 BucketName
      bucketName = "*** Provide your bucket name ***"

      // 存储桶中的对象名
      objectKey = "example_dir/example.txt"
      ctx       = context.Background()
   )
   // 初始化客户端
   client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
   checkErr(err)

   // 设置对象元数据信息
   output, err := client.SetObjectMeta(ctx, &tos.SetObjectMetaInput{
      Bucket: bucketName,
      Key:    objectKey,
      // 用户自定义元数据信息
      Meta: map[string]string{"key": "value"},
      // 设置对象类型
      ContentType: "text/html",
      // 设置对象下载时内容语言格式
      ContentLanguage: "zh-cn",
      // 设置缓存策略
      CacheControl: "no-store",
      // 设置缓存过期时间
      Expires: time.Now().UTC().Add(time.Hour),
      // 设置下载内容下载时的名称
      ContentDisposition: "example.png",
      // 设置下载时编码类型
      ContentEncoding: "deflate",
   })
   checkErr(err)
   fmt.Println("SetObjectMeta Request ID:", output.RequestID)
}

查询对象元数据信息(判断对象是否存在)

注意

获取对象元数据前,您必须具有 tos:GetObject 权限,具体操作请参见 IAM 策略概述

package main

import (
   "context"
   "fmt"
   "net/http"

   "github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)

func checkErr(err error) {
   if err != nil {
      if serverErr, ok := err.(*tos.TosServerError); ok {
         fmt.Println("Error:", serverErr.Error())
         fmt.Println("Request ID:", serverErr.RequestID)
         fmt.Println("Response Status Code:", serverErr.StatusCode)
         fmt.Println("Response Header:", serverErr.Header)
         fmt.Println("Response Err Code:", serverErr.Code)
         fmt.Println("Response Err Msg:", serverErr.Message)
      } else if clientErr, ok := err.(*tos.TosClientError); ok {
         fmt.Println("Error:", clientErr.Error())
         fmt.Println("Client Cause Err:", clientErr.Cause.Error())
      } else {
         fmt.Println("Error:", err)
      }
      panic(err)
   }
}

func main() {
   var (
      accessKey = os.Getenv("TOS_ACCESS_KEY")
      secretKey = os.Getenv("TOS_SECRET_KEY")
      // Bucket 对应的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
      endpoint = "https://tos-cn-beijing.volces.com"
      region   = "cn-beijing"
      // 填写 BucketName
      bucketName = "*** Provide your bucket name ***"

      // 存储桶中的对象名
      objectKey = "example_dir/example.txt"
      ctx       = context.Background()
   )
   // 初始化客户端
   client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
   checkErr(err)
   output, err := client.HeadObjectV2(ctx, &tos.HeadObjectV2Input{
      Bucket: bucketName,
      Key:    objectKey,
   })
   if err != nil {
      if serverErr, ok := err.(*tos.TosServerError); ok {
         // 判断对象是否存在
         if serverErr.StatusCode == http.StatusNotFound {
            fmt.Println("Object not found.")
         } else {
            fmt.Println("Error:", serverErr.Error())
            fmt.Println("Request ID:", serverErr.RequestID)
            fmt.Println("Response Status Code:", serverErr.StatusCode)
            fmt.Println("Response Header:", serverErr.Header)
            fmt.Println("Response Err Code:", serverErr.Code)
            fmt.Println("Response Err Msg:", serverErr.Message)
            panic(err)
         }
      } else {
         panic(err)
      }
   }
   fmt.Println("HeadObjectV2 Request ID:", output.RequestID)
   // 查看内容语言格式
   fmt.Println("HeadObjectV2 Response ContentLanguage:", output.ContentLanguage)
   // 查看下载时的名称
   fmt.Println("HeadObjectV2 Response ContentDisposition:", output.ContentDisposition)
   // 查看编码类型
   fmt.Println("HeadObjectV2 Response ContentEncoding:", output.ContentEncoding)
   // 查看缓存策略
   fmt.Println("HeadObjectV2 Response CacheControl:", output.CacheControl)
   // 查看对象类型
   fmt.Println("HeadObjectV2 Response ContentType:", output.ContentType)
   // 查看缓存过期时间
   fmt.Println("HeadObjectV2 Response Expires:", output.Expires)
}

相关文档

关于设置对象元数据的 API 文档,请参见 SetObjectMeta