使用 Python 从源对象 URL 复制 Blob

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

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

要了解如何使用异步 API 复制 Blob,请参阅《从源对象 URL 异步复制 Blob》。

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍如何设置项目来使用适用于 Python 的 Azure Blob 存储客户端库。 有关更多详细信息,请参阅 Azure Blob 存储和 Python 入门

要使用本文中的代码示例,请按照以下步骤设置项目。

安装包

使用 pip install 安装以下包:

pip install azure-storage-blob azure-identity

添加 import 语句

添加以下 import 语句:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    BlobClient,
)

授权

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

创建客户端对象

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

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

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

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

本部分概述了由适用于 Python 的 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 的方案。 upload_blob_from_url 方法可以选择接受布尔参数来指示是否应覆盖现有的 blob,如示例所示。

def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient):
    # Get the source blob URL and create the destination blob
    # set overwrite param to True if you want to overwrite existing blob data
    destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)

从 Azure 外部的源复制 Blob

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

def copy_from_external_source(self, source_url: str, destination_blob: BlobClient):
    # Create the destination blob from the source URL
    # set overwrite param to True if you want to overwrite existing blob data
    destination_blob.upload_blob_from_url(source_url=source_url, overwrite=False)

从源对象 URL 异步复制 Blob

适用于 Python 的 Azure Blob 存储客户端库支持从源 URL 异步复制 Blob。 要详细了解项目设置要求,请参阅异步编程

按照以下步骤使用异步 API 从源对象 URL 复制 Blob:

  1. 添加以下 import 语句:
import asyncio

from azure.identity.aio import DefaultAzureCredential
from azure.storage.blob.aio import BlobServiceClient, BlobClient
  1. 添加代码以使用asyncio.run运行程序。 此函数运行传递的协同例程(我们示例中的main()),并管理asyncio事件循环。 使用 async/await 语法声明协同例程。 在此示例中,main() 协同例程会首先使用 async with 创建顶级 BlobServiceClient,然后调用从源 URL 复制 Blob 的方法。 请注意,只有顶级客户端需要使用async with,因为基于它创建的其他客户端会共享同一连接池。
async def main():
    sample = BlobCopySamples()

    # TODO: Replace <storage-account-name> with your actual storage account name
    account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
    credential = DefaultAzureCredential()

    async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
        # Copy a blob from one container to another in the same storage account
        source = blob_service_client.get_blob_client(container="source-container", blob="sample-blob.txt")
        destination = blob_service_client.get_blob_client(container="destination-container", blob="sample-blob.txt")
        await sample.copy_from_source_in_azure(source_blob=source, destination_blob=destination)

if __name__ == '__main__':
    asyncio.run(main())
  1. 添加代码以从源 URL 复制 Blob。 除使用 async 关键字声明该方法,以及在调用 upload_blob_from_url 方法时使用 await 关键字以外,该代码与同步示例相同。
async def copy_from_source_in_azure(self, source_blob: BlobClient, destination_blob: BlobClient):
    # Get the source blob URL and create the destination blob
    # set overwrite param to True if you want to overwrite existing blob data
    await destination_blob.upload_blob_from_url(source_url=source_blob.url, overwrite=False)

有了此基本设置,即可使用 async/await 语法将本文中的其他示例实现为协同例程。

资源

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

代码示例

REST API 操作

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

客户端库资源

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