你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Go 上传块 blob

本文介绍如何使用适用于 Go 的 Azure 存储客户端模块上传 blob。 可以通过文件路径、流、二进制对象或文本字符串将数据上传到块 Blob。 还可以上传带有索引标记的 Blob。

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍了如何设置项目来使用适用于 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
}

授权

授权机制必须具有上传 blob 所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需要 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 若要了解详细信息,请参阅有关放置 Blob (REST API)放置块 (REST API) 的授权指南。

将数据上传到块 Blob

若要上传 blob,请从客户端对象调用以下任一方法:

若要执行上传,客户端库可以使用放置 Blob 或一系列放置块调用,后跟 Put Block List。 此行为取决于对象的总体大小和数据传输选项的设置方式。

通过本地文件路径上传块 Blob

以下示例会将本地文件上传到块 blob:

func uploadBlobFile(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the file to the specified container with the specified blob name
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file, nil)
    handleError(err)
}

通过流式传输上传块 Blob

以下示例将创建一个 Reader 实例,并且会像处理字节流那样从字符串中进行读取。 然后将该流上传到块 blob:

func uploadBlobStream(client *azblob.Client, containerName string, blobName string) {
    data := "Hello, world!"
    blobContentReader := strings.NewReader(data)

    // Upload the file to the specified container with the specified blob name
    _, err := client.UploadStream(context.TODO(), containerName, blobName, blobContentReader, nil)
    handleError(err)
}

将二进制数据上传到块 Blob

以下示例将二进制数据上传到块 blob:

func uploadBlobBuffer(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, nil)
    handleError(err)
}

上传带有索引标记的块 blob

以下示例上传设置了索引标记的块 blob:

func uploadBlobWithIndexTags(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob with index tags
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, &azblob.UploadBufferOptions{
        Tags: map[string]string{
            "key1": "value1",
            "key2": "value2",
        },
    })
    handleError(err)
}

使用配置选项上传块 blob

上传 blob 时,可以定义客户端库配置选项。 可以优化这些选项以提高性能、增强可靠性和优化成本。 以下代码示例演示如何定义上传操作的配置选项。

指定用于上传的数据传输选项

你可以设置上传 blob 时的配置选项,以优化性能。 以下配置选项可用于上传操作:

  • BlockSize:上传块 blob 时每个块的大小。 默认值为 1 MiB。
  • Concurrency:上传期间要使用的并行连接的最大数目。 默认值是 1秒。

若要详细了解 Blob 存储的传输大小限制,请参阅 Blob 存储的缩放目标

下面的代码示例演示如何使用 UploadFileOptions 指定数据传输选项。 此示例中提供的值不作为建议。 若要正确优化这些值,需要考虑应用的特定需求。

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

注意

本指南中的代码示例旨在帮助你开始使用 Azure Blob 存储和 Go。 你应该修改错误处理和 Context 值以满足应用程序的需求。

资源

若要详细了解如何使用适用于 Go 的 Azure Blob 存储客户端模块上传 Blob,请参阅以下资源。

代码示例

REST API 操作

Azure SDK for Go 包含基于 Azure REST API 而生成的库,从而允许你通过熟悉的 Go 范式与 REST API 操作进行交互。 用于上传 blob 的客户端库方法使用以下 REST API 操作:

客户端模块资源

请参阅