Compartir a través de

使用 .NET 从源对象 URL 复制 Blob

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

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

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍如何设置项目来使用适用于 .NET 的 Azure Blob 存储客户端库。 步骤包括安装包、添加 using 指令,以及创建已授权的客户端对象。 有关详细信息,请参阅 Azure Blob 存储和 .NET 入门

安装包

从项目目录中,使用 dotnet add package 命令安装 Azure Blob 存储和 Azure 标识客户端库的包。 与 Azure 服务的无密码连接需要 Azure.Identity 包。

dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity

添加 using 指令

将这些 using 指令添加到代码文件的顶部:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

本文中的某些代码示例可能需要其他 using 指令。

创建客户端对象

若要将应用连接到 Blob 存储,请创建 BlobServiceClient 的实例。 以下示例演示如何使用 DefaultAzureCredential 创建客户端对象进行授权:

public BlobServiceClient GetBlobServiceClient(string accountName)
{
    BlobServiceClient client = new(
        new Uri($"https://{accountName}.blob.core.chinacloudapi.cn"),
        new DefaultAzureCredential());

    return client;
}

可以在 .NET 应用中为依赖项注入注册服务客户端。

还可以为特定容器Blob 创建客户端对象。 要详细了解如何创建和管理客户端对象,请参阅 创建和管理与数据资源交互的客户端对象

授权

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

关于从源对象 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

本部分概述了用于 .NET 的 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 进行复制的方案。 SyncUploadFromUriAsync 方法可以选择接受布尔参数来指示是否应覆盖现有 blob,如示例所示。 参数 overwrite 默认为 false。

//-------------------------------------------------
// Copy a blob from the same storage account
//-------------------------------------------------
public static async Task CopyWithinStorageAccountAsync(
    BlobClient sourceBlob,
    BlockBlobClient destinationBlob)
{
    // Get the source blob URI and create the destination blob
    // overwrite param defaults to false
    await destinationBlob.SyncUploadFromUriAsync(sourceBlob.Uri/*, overwrite: false*/);
}

SyncUploadFromUriAsync 方法还可以接受 BlobSyncUploadFromUriOptions 参数,以指定操作的更多选项。

从 Azure 外部的源复制 Blob

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

//-------------------------------------------------
// Copy a blob from an external source
//-------------------------------------------------
public static async Task CopyFromExternalSourceAsync(
    string sourceLocation,
    BlockBlobClient destinationBlob)
{
    Uri sourceUri = new(sourceLocation);

    // Create the destination blob from the source URL
    // overwrite param defaults to false
    await destinationBlob.SyncUploadFromUriAsync(sourceUri/*, overwrite: false*/);
}

资源

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

代码示例

REST API 操作

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

客户端库资源

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