分享方式:


使用 Go 管理 Blob 屬性和元數據

除了包含的資料之外,Blob 還支援系統屬性和使用者定義的中繼資料。 本文說明如何使用適用於 GoAzure 儲存體 用戶端模組來管理系統屬性和使用者定義元數據。

必要條件

設定您的環境

如果您沒有現有的專案,本節說明如何設定專案以使用適用於 Go 的 Azure Blob 儲存體 客戶端模組。 這些步驟包括模組安裝、新增 import 路徑,以及建立授權的客戶端物件。 如需詳細資訊,請參閱開始使用 Azure Blob 儲存體 和 Go

安裝模組

使用下列命令安裝 azblob 模組:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

若要使用 Microsoft Entra ID 進行驗證(建議),請使用下列命令安裝 azidentity 模組:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

新增匯入路徑

在您的程式代碼檔案中,新增下列匯入路徑:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

本文中的某些程式代碼範例可能需要其他匯入路徑。 如需特定詳細數據和範例使用方式,請參閱 程式代碼範例

建立用戶端物件

若要將應用程式連線到 Blob 記憶體,請使用 azblob 建立客戶端物件。NewClient。 下列範例示範如何使用 來建立客戶端物件 DefaultAzureCredential 以進行授權:

func getServiceClientTokenCredential(accountURL string) *azblob.Client {
    // Create a new service client with token credential
    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(accountURL, credential, nil)
    handleError(err)

    return client
}

授權

授權機制必須具有使用容器屬性或元數據的必要許可權。 若要使用 Microsoft Entra ID 進行授權(建議使用),您需要 Azure RBAC 內建角色記憶體 Blob 數據讀取器或更新版本的取得作業,以及設定作業的記憶體 Blob 數據參與者或更高版本。 若要深入瞭解,請參閱設定 Blob 屬性(REST API)、取得 Blob 屬性(REST API)設定 Blob 元數據(REST API)或取得 Blob 元數據(REST API)授權指引。

關於屬性和中繼資料

  • 系統屬性:系統屬性存在於每個 Blob 儲存體資源上。 其中一些可以讀取或設定,另一些則是唯讀的。 實際上,某些系統屬性會對應至特定標準 HTTP 標頭。 適用於 Go 的 Azure 儲存體 用戶端連結庫會為您維護這些屬性。

  • 使用者定義的中繼資料:使用者定義的中繼資料是由您為 Blob 儲存體資源所指定一或多個成對的名稱和數值所組成。 您可以使用中繼資料來儲存資源的額外值。 中繼資料值僅供您自己使用,並不會影響資源的運作方式。

    中繼資料名稱/值組是有效的 HTTP 標頭,所以應該遵守控管 HTTP 標頭的所有限制。 如需有關中繼資料命名需求的詳細資訊,請參閱中繼資料名稱

注意

Blob 索引標記也提供將任意使用者定義索引鍵/值屬性與 Azure Blob 儲存體資源一起儲存的功能。 雖然與中繼資料類似,但是只有 Blob 索引標記會自動編製索引,並且可讓原生 Blob 服務進行搜尋。 除非您利用個別服務 (例如 Azure 搜尋服務),否則中繼資料無法進行編製索引和查詢。

若要深入了解此功能,請參閱使用 Blob 索引 (預覽) 來管理和尋找 Azure Blob 儲存體上的資料

設定和擷取屬性

若要在 Blob 上設定屬性,請從 Blob 用戶端物件呼叫下列方法:

未明確設定的任何屬性都會被清除。 若要保留任何現有的屬性,您可以首先擷取 Blob 屬性,然後使用這些屬性填入未更新的標頭。

下列程式碼範例會在 Blob 上設定 BlobContentTypeBlobContentLanguage 系統屬性,同時保留現有的屬性:

func setBlobProperties(client *azblob.Client, containerName string, blobName string) {
    // Reference the blob as a client object
    blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    // Get the existing blob properties
    resp, err := blobClient.GetProperties(context.TODO(), nil)
    handleError(err)

    // Set the new blob properties and include existing properties
    _, err = blobClient.SetHTTPHeaders(context.TODO(), blob.HTTPHeaders{
        BlobContentType:        to.Ptr("text/plain"),
        BlobContentLanguage:    to.Ptr("en-us"),
        BlobContentEncoding:    resp.ContentEncoding,
        BlobContentDisposition: resp.ContentDisposition,
        BlobCacheControl:       resp.CacheControl,
    }, nil)
    handleError(err)
}

若要擷取 Blob 上的屬性,請從 Blob 用戶端物件呼叫下列方法:

下列程式碼範例會取得 Blob 的系統屬性,並顯示部分值:

func getBlobProperties(client *azblob.Client, containerName string, blobName string) {
    // Reference the blob as a client object
    blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    // Get the blob properties
    resp, err := blobClient.GetProperties(context.TODO(), nil)
    handleError(err)

    // Print the blob properties
    fmt.Printf("Content type: %v\n", *resp.ContentType)
    fmt.Printf("Content language: %v\n", *resp.ContentLanguage)
}

設定及擷取中繼資料

您可以將中繼資料指定為 blob 或容器資源上的一個或多個成對的名稱和數值。 若要設定元數據,請從 Blob 用戶端物件使用下列方法,傳送包含名稱/值組的對應:

下列程式碼範例會在 Blob 上設定中繼資料:

func setBlobMetadata(client *azblob.Client, containerName string, blobName string) {
    // Reference the blob as a client object
    blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    // Set the blob metadata
    var metadata = make(map[string]*string)
    metadata["key1"] = to.Ptr("value1")
    metadata["key2"] = to.Ptr("value2")

    _, err := blobClient.SetMetadata(context.TODO(), metadata, nil)
    handleError(err)
}

若要擷取元數據,請從 Blob 用戶端物件呼叫 GetProperties 方法,並存取 Metadata 回應中的字段。 GetProperties 方法會藉由呼叫取得 Blob 屬性作業和取得 Blob 中繼資料作業來擷取 Blob 屬性和中繼資料。

下列程式碼範例會讀取 Blob 上的中繼資料,並列印每個索引鍵/值組:

func getBlobMetadata(client *azblob.Client, containerName string, blobName string) {
    // Reference the blob as a client object
    blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    // Get the blob properties, which includes metadata
    resp, err := blobClient.GetProperties(context.TODO(), nil)
    handleError(err)

    // Print the blob metadata
    for k, v := range resp.Metadata {
        fmt.Printf("%v: %v\n", k, *v)
    }
}

注意

本指南中的程式碼範例旨在協助您開始使用 Azure Blob 儲存體和 Go。 您應該修改錯誤處理和 Context 值,以符合應用程式的需求。

資源

若要深入瞭解如何使用適用於 Go 的 Azure Blob 儲存體 用戶端模組來管理系統屬性和使用者定義元數據,請參閱下列資源。

程式碼範例

REST API 操作

Azure SDK for Go 包含以 Azure REST API 為基礎的連結庫,可讓您透過熟悉的 Go 架構與 REST API 作業互動。 用來管理系統屬性與使用者定義中繼資料的用戶端程式庫方法會使用下列 REST API 作業:

用戶端模組資源