全部產品
Search
文件中心

Object Storage Service:Go管理檔案中繼資料

更新時間:Oct 31, 2024

Object Storage Service儲存的檔案(Object)資訊包含Key、Data和Object Meta。Object Meta是對檔案的屬性描述,包括HTTP標準屬性(HTTP Header)和使用者自訂中繼資料(User Meta)兩種。您可以通過設定HTTP標準屬性來自訂HTTP請求的策略,例如檔案(Object)緩衝策略、強制下載策略等。您還可以通過設定使用者自訂中繼資料來標識Object的用途或屬性等。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠

  • 本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證

  • 本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化

  • 要設定檔案中繼資料,您必須具有oss:PutObject許可權;要擷取檔案中繼資料,您必須具有oss:GetObject許可權。具體操作,請參見為RAM使用者授權自訂的權限原則

範例程式碼

上傳檔案時設定中繼資料

警告

在上傳檔案時設定中繼資料,請確保該Bucket內不存在同名檔案,否則會覆蓋同名檔案。關於如何避免覆蓋同名檔案的更多資訊,請參見避免覆蓋同名檔案

package main

import (
	"log"
	"strings"
	"time"

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

func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 設定簽名版本
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// 填寫Bucket名稱,例如examplebucket。
	bucketName := "examplebucket" // 請替換為實際的Bucket名稱
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket: %v", err)
	}

	// 設定檔案中繼資料,例如指定到期時間為2049年01月10日 23:00:00 GMT,存取權限為公用讀取,自訂中繼資料為MyProp(取值MyPropVal)。
	expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
	options := []oss.Option{
		oss.Expires(expires),
		oss.ObjectACL(oss.ACLPublicRead),
		oss.Meta("MyProp", "MyPropVal"),
	}

	// 使用資料流上傳檔案。
	// 填寫Object的完整路徑,完整路徑中不包含Bucket名稱,例如exampledir/exampleobject.txt。
	objectName := "exampledir/exampleobject.txt" // 請替換為實際的物件路徑
	err = bucket.PutObject(objectName, strings.NewReader("MyObjectValue"), options...)
	if err != nil {
		log.Fatalf("Failed to upload object: %v", err)
	}

	// 擷取檔案中繼資料。
	props, err := bucket.GetObjectDetailedMeta(objectName)
	if err != nil {
		log.Fatalf("Failed to get object detailed metadata: %v", err)
	}
	log.Printf("Object Meta: %+v\n", props)
}

修改已有檔案的中繼資料

...

// 一次修改一條中繼資料。
err = bucket.SetObjectMeta(objectName, oss.Meta("MyMeta", "MyMetaValue1"))
if err != nil {
	log.Fatalf("Failed to set single metadata: %v", err)
}

// 一次修改多條中繼資料。
options := []oss.Option{
	oss.Meta("MyMeta", "MyMetaValue2"),
	oss.Meta("MyObjectLocation", "HangZhou"),
}
err = bucket.SetObjectMeta(objectName, options...)
if err != nil {
	log.Fatalf("Failed to set multiple metadatas: %v", err)
}

// 擷取檔案中繼資料。
props, err := bucket.GetObjectDetailedMeta(objectName)
if err != nil {
	log.Fatalf("Failed to get object detailed metadata: %v", err)
}
log.Printf("Object Meta: %+v\n", props)

擷取檔案中繼資料

...

// 擷取檔案中繼資料。
props, err := bucket.GetObjectDetailedMeta(objectName)
if err != nil {
	log.Fatalf("Failed to get object detailed metadata: %v", err)
}
log.Printf("Object Meta: %+v\n", props)

常見問題

在上傳檔案時設定中繼資料,如何避免覆蓋Bucket內的同名檔案?

為避免覆蓋Bucket內的同名檔案,您可以選擇以下任意方式:

  • 開啟版本控制

    開啟版本控制功能後,Bucket中被覆蓋的檔案會以歷史版本的形式儲存下來。您可以隨時恢複歷史版本檔案。更多資訊,請參見開啟版本控制

  • 在上傳請求中攜帶禁止覆蓋同名檔案的參數

    在上傳請求的Header中攜帶參數x-oss-forbid-overwrite,並指定其值為true。當您上傳的檔案與Bucket中已有的檔案同名時,該檔案會上傳失敗,並返回FileAlreadyExists錯誤。更多資訊,請參見PutObject

相關文檔

  • 關於檔案中繼資料的完整範例程式碼,請參見GitHub樣本

  • 關於在簡單上傳過程中設定檔案中繼資料的API介面說明,請參見PutObject

  • 關於修改已有檔案中繼資料的API介面說明,請參見CopyObject

  • 關於擷取檔案中繼資料的API介面說明,請參見GetObjectMeta