Поделиться через


Копирование большого двоичного объекта из URL-адреса исходного объекта с помощью Python

В этой статье показано, как скопировать большой двоичный объект из URL-адреса исходного объекта с помощью клиентской библиотеки служба хранилища Azure для Python. Большой двоичный объект можно скопировать из источника в той же учетной записи хранения, из источника в другой учетной записи хранения или из любого доступного объекта, полученного через HTTP-запрос GET по указанному URL-адресу.

Методы клиентской библиотеки, описанные в этой статье, используют операции Put Blob From URL и Put Block From URL REST API. Эти методы предпочтительны для сценариев копирования, в которых требуется переместить данные в учетную запись хранения и иметь URL-адрес исходного объекта. Операции копирования, в которых требуется асинхронное планирование, см. в статье "Копирование большого двоичного объекта с асинхронным планированием с помощью Python".

Сведения о копировании БОЛЬШИХ двоичных объектов с помощью асинхронных API см. в статье "Копирование большого двоичного объекта из URL-адреса исходного объекта" асинхронно.

Необходимые компоненты

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Дополнительные сведения см. в статье "Начало работы с Хранилище BLOB-объектов Azure и Python".

Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.

Установка пакетов

Установите следующие пакеты с помощью pip install:

pip install azure-storage-blob azure-identity

Добавление инструкций импорта

Добавьте следующие операторы import :

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

Авторизация

Механизм авторизации должен иметь необходимые разрешения для выполнения операции копирования. Для авторизации с помощью идентификатора Microsoft Entra (рекомендуется), требуется встроенный участник данных хранилища BLOB-объектов хранилища ролей или более поздней версии. Дополнительные сведения см. в руководстве по авторизации для PUT BLOB-объекта из URL-адреса (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.windows.net"
credential = DefaultAzureCredential()

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

Можно также создавать клиентские объекты для определенных контейнеров или больших двоичных объектов напрямую или из BlobServiceClient объекта. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Сведения о копировании БОЛЬШИХ двоичных объектов из URL-адреса исходного объекта

Операция Put Blob From URL создает новый блочный BLOB-объект, в котором содержимое большого двоичного объекта считываются из заданного URL-адреса. Операция выполняется синхронно.

Источник может быть любым объектом, извлекаемым через стандартный HTTP-запрос GET по указанному URL-адресу. К ним относятся блочные BLOB-объекты, добавление больших двоичных объектов, страничные BLOB-объекты, моментальные снимки BLOB-объектов, версии BLOB-объектов или любой доступный объект внутри Или за пределами Azure.

Когда исходный объект является блочного BLOB-объекта, копируется все зафиксированное содержимое большого двоичного объекта. Содержимое целевого большого двоичного объекта идентично содержимому исходного объекта, но список зафиксированных блоков не сохраняется и не копируются незафиксированные блоки.

Назначение всегда является блочного большого двоичного объекта, существующего блочного большого двоичного объекта или нового блочного большого двоичного объекта, созданного операцией. Содержимое существующего большого двоичного объекта перезаписывается с содержимым нового большого двоичного объекта.

Операция Put Blob From URL всегда копирует весь исходный большой двоичный объект. Копирование диапазона байтов или набора блоков не поддерживается. Чтобы выполнить частичные обновления содержимого блочного BLOB-объекта с помощью исходного URL-адреса, используйте API put Block From URL вместе Put Block Listс .

Дополнительные сведения об Put Blob From URL операции, включая ограничения размера BLOB-объектов и рекомендации по выставлению счетов, см. в статье Put Blob From URL-примечания.

Копирование большого двоичного объекта из URL-адреса исходного объекта

В этом разделе представлен обзор методов, предоставляемых клиентской библиотекой служба хранилища Azure для Python для выполнения операции копирования из URL-адреса исходного объекта.

Следующий метод упаковывает операцию PUT BLOB-объекта из REST API URL-адреса и создает новый блочный BLOB-объект, в котором содержимое большого двоичного объекта считывается из заданного URL-адреса :

Эти методы предпочтительны для сценариев, в которых требуется переместить данные в учетную запись хранения и иметь URL-адрес исходного объекта.

Для больших объектов можно работать с отдельными блоками. В следующем методе выполняется оболочка операции PUT Block From URL REST API. Этот метод создает новый блок для фиксации в составе большого двоичного объекта, в котором содержимое считывается из исходного URL-адреса:

Копирование большого двоичного объекта из источника в Azure

Если вы копируете большой двоичный объект из источника в Azure, доступ к исходному BLOB-объекту можно авторизовать с помощью идентификатора Microsoft Entra, подписанного URL-адресом (SAS) или ключа учетной записи.

В следующем примере показано, как скопировать исходный большой двоичный объект в Azure. Метод upload_blob_from_url может при необходимости принять логический параметр, чтобы указать, следует ли перезаписывать существующий большой двоичный объект, как показано в примере.

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

Вы можете выполнить операцию копирования для любого исходного объекта, который можно получить через HTTP-запрос GET по указанному URL-адресу, включая доступные объекты за пределами Azure. В следующем примере показано, как скопировать большой двоичный объект из URL-адреса объекта с доступом.

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-объектов Azure для Python поддерживает копирование большого двоичного объекта из исходного URL-адреса асинхронно. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

Выполните следующие действия, чтобы скопировать большой двоичный объект из URL-адреса исходного объекта с помощью асинхронных API:

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobClient
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину в main() нашем примере и управляет циклом asyncio событий. Корутины объявляются с синтаксисом async/await. В этом примере корутин сначала создает верхний уровень BlobServiceClient с помощьюasync with, а затем вызывает метод, main() копирующий большой двоичный объект из исходного URL-адреса. Обратите внимание, что использовать только клиент верхнего уровня, так как другие клиенты, созданные из него, используют 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.windows.net"
        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())
    
  3. Добавьте код для копирования большого двоичного объекта из исходного URL-адреса. Следующий пример кода совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевым словом, а await ключевое слово используется при вызове upload_blob_from_url метода.

    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.

Ресурсы

Дополнительные сведения о копировании больших двоичных объектов с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для Python см. в следующих ресурсах.

Примеры кода

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки, описанные в этой статье, используют следующие операции REST API:

Ресурсы клиентской библиотеки

  • Эта статья является частью руководства разработчика хранилища BLOB-объектов для Python. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Python.