使用 Go 从源对象 URL 复制 Blob

本文介绍如何使用适用于 Go 的 Azure 存储客户端模块从源对象 URL 复制 Blob。 可以从同一存储帐户中的源、不同存储帐户中的源或从给定 URL 上通过 HTTP GET 请求检索的任何可访问对象复制 Blob。

本文中介绍的客户端库方法使用 Put Blob From URLPut Block From URL REST API 操作。 对于要将数据移动到存储帐户并具有源对象的 URL 的复制方案,首选这些方法。 有关需要异步计划的复制操作,请参阅使用 Go 通过异步计划复制 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
}

授权

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

关于从源对象 URL 复制 Blob

Put Blob From URL 操作会创建一个新的块 Blob,该 Blob 的内容是从给定 URL 读取的。 该操作同步完成。

源可以是可通过给定 URL 上的标准 HTTP GET 请求检索的任何对象。 这包括块 Blob、追加 blob、页 blob、Blob 快照、Blob 版本或 Azure 内外的任何可访问对象。

当源对象是块 Blob 时,将复制所有提交的 Blob 内容。 目标 Blob 的内容与源内容相同,但不会保留已提交的块的列表,也不会复制未提交的块。

目标始终是块 blob,可以是现有的 blob,或操作创建的新块 blob。 现有 blob 的内容会被新 blob 的内容覆盖。

Put Blob From URL 操作会始终复制整个源 blob。 不支持复制字节范围或块集。 若要使用源 URL 对块 blob 的内容执行部分更新,请使用 Put Block From URL API 和 Put Block List

若要详细了解 Put Blob From URL 操作(包括 blob 大小限制和计费注意事项),请参阅 Put Blob From URL 注解

从源对象 URL 复制 blob

本部分概述了用于 Go 的 Azure 存储客户端库提供的从源对象 URL 执行复制操作的方法。

以下方法会包装 Put Blob From URL REST API 操作,并创建一个新的块 blob,该 blob 的内容是从给定 URL 读取的:

对于你要将数据移动到存储帐户并有源对象的 URL 的方案,首选此方法。

对于大型对象,可以选择使用单个块。 以下方法可包装 Put Block From URL REST API 操作。 此方法会创建一个新块,以作为 blob 的一部分提交,其中的内容是从源 URL 读取的:

在 Azure 中从源复制 blob

如果要在 Azure 中从源复制 Blob,可以通过 Microsoft Entra ID(推荐)、共享访问签名 (SAS) 或帐户密钥来授权对源 Blob 的访问。

以下代码示例演示了在 Azure 中复制源 Blob 的方案。 在此示例中,我们还使用 UploadBlobFromURLOptions 结构将目标 Blob 的访问层设置为 Cool

func copyFromSourceURL(srcBlob *blockblob.Client, destBlob *blockblob.Client) {
    // Set copy options
    copyOptions := blockblob.UploadBlobFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    _, err := destBlob.UploadBlobFromURL(context.TODO(), srcBlob.URL(), &copyOptions)
    handleError(err)
}

以下示例演示了示例用法:

// TODO: replace <storage-account-name> placeholders with actual storage account names
srcURL := "https://<src-storage-account-name>.blob.core.chinacloudapi.cn/"
destURL := "https://<dest-storage-account-name>.blob.core.chinacloudapi.cn/"

credential, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)

srcClient, err := azblob.NewClient(srcURL, credential, nil)
handleError(err)
destClient, err := azblob.NewClient(destURL, credential, nil)
handleError(err)

srcBlob := srcClient.ServiceClient().NewContainerClient("source-container").NewBlockBlobClient("source-blob")
destBlob := destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-1")

copyFromSourceURL(srcBlob, destBlob)

从 Azure 外部的源复制 Blob

你可以对可通过 HTTP GET 请求在给定 URL 上检索的任何源对象执行复制操作,包括 Azure 外部的可访问对象。 以下代码示例演示了从可访问的源对象 URL 复制 Blob 的方案。

func copyFromExternalSource(srcURL string, destBlob *blockblob.Client) {
    // Set copy options
    copyOptions := blockblob.UploadBlobFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    _, err := destBlob.UploadBlobFromURL(context.TODO(), srcURL, &copyOptions)
    handleError(err)
}

以下示例演示了示例用法:

externalURL := "<source-url>"

destBlob = destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-2")

copyFromExternalSource(externalURL, destBlob)

资源

若要详细了解如何使用适用于 Go 的 Azure Blob 存储客户端库来复制 Blob,请参阅以下资源。

代码示例

REST API 操作

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

客户端模块资源

  • 本文是适用于 Go 的 Blob 存储开发人员指南的一部分。 若要了解详细信息,请参阅构建 Go 应用中的完整开发人员指南文章列表。