Delen via


Een blob kopiëren vanuit een url van een bronobject met Python

In dit artikel wordt beschreven hoe u een blob kopieert vanuit een bronobject-URL met behulp van de Azure Storage-clientbibliotheek voor Python. U kunt een blob kopiëren vanuit een bron binnen hetzelfde opslagaccount, van een bron in een ander opslagaccount of van een toegankelijk object dat via een HTTP GET-aanvraag op een bepaalde URL wordt opgehaald.

De clientbibliotheekmethoden die in dit artikel worden behandeld, maken gebruik van de Put Blob From URL en Put Block From URL REST API-bewerkingen. Deze methoden hebben de voorkeur voor kopieerscenario's waarbij u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben. Zie Een blob met asynchrone planning kopiëren met asynchrone planning met behulp van Python voor kopieerbewerkingen waar u asynchrone planning wilt.

Zie Een blob kopiëren vanuit een bronobject-URL asynchroon voor meer informatie over het kopiëren van blobs met behulp van asynchrone API's.

Vereisten

Uw omgeving instellen

Als u geen bestaand project hebt, ziet u in deze sectie hoe u een project instelt voor gebruik met de Azure Blob Storage-clientbibliotheek voor Python. Zie Aan de slag met Azure Blob Storage en Python voor meer informatie.

Als u wilt werken met de codevoorbeelden in dit artikel, volgt u deze stappen om uw project in te stellen.

Pakketten installeren

Installeer de volgende pakketten met behulp van pip install:

pip install azure-storage-blob azure-identity

Importinstructies toevoegen

Voeg de volgende import instructies toe:

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

Autorisatie

Het autorisatiemechanisme moet over de benodigde machtigingen beschikken om een kopieerbewerking uit te voeren. Voor autorisatie met Microsoft Entra ID (aanbevolen) hebt u ingebouwde Azure RBAC-rol Opslagblobgegevensbijdrager of hoger nodig. Zie de autorisatierichtlijnen voor Put Blob From URL (REST API) of Put Block From URL (REST API) voor meer informatie.

Een clientobject maken

Als u een app wilt verbinden met Blob Storage, maakt u een exemplaar van BlobServiceClient. In het volgende voorbeeld ziet u hoe u een clientobject maakt met behulp van DefaultAzureCredential autorisatie:

# 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)

U kunt ook clientobjecten maken voor specifieke containers of blobs, rechtstreeks of vanuit het BlobServiceClient object. Zie Clientobjecten maken en beheren die interactie hebben met gegevensbronnen voor meer informatie over het maken en beheren van clientobjecten.

Over het kopiëren van blobs vanuit een bronobject-URL

Met de Put Blob From URL bewerking wordt een nieuwe blok-blob gemaakt waarin de inhoud van de blob wordt gelezen uit een bepaalde URL. De bewerking wordt synchroon voltooid.

De bron kan elk object ophalen via een standaard HTTP GET-aanvraag op de opgegeven URL. Dit omvat blok-blobs, toevoeg-blobs, pagina-blobs, blob-momentopnamen, blobversies of een toegankelijk object binnen of buiten Azure.

Wanneer het bronobject een blok-blob is, wordt alle vastgelegde blob-inhoud gekopieerd. De inhoud van de doel-blob is identiek aan de inhoud van de bron, maar de lijst met vastgelegde blokken blijft niet behouden en niet-doorgevoerde blokken worden niet gekopieerd.

De bestemming is altijd een blok-blob, een bestaande blok-blob of een nieuwe blok-blob die door de bewerking is gemaakt. De inhoud van een bestaande blob wordt overschreven met de inhoud van de nieuwe blob.

Met Put Blob From URL de bewerking wordt altijd de hele bron-blob gekopieerd. Het kopiëren van een bereik van bytes of een set blokken wordt niet ondersteund. Als u gedeeltelijke updates wilt uitvoeren voor de inhoud van een blok-blob met behulp van een bron-URL, gebruikt u de PUT Block From URL-API samen met Put Block List.

Zie Opmerkingen bij Put Blob From URL voor meer informatie over de Put Blob From URL bewerking, inclusief beperkingen voor blobgrootten en factureringsoverwegingen.

Een blob kopiëren vanuit een bronobject-URL

In deze sectie vindt u een overzicht van methoden die door de Azure Storage-clientbibliotheek voor Python worden geleverd om een kopieerbewerking uit te voeren vanaf een bronobject-URL.

De volgende methode verpakt de bewerking Put Blob From URL REST API en maakt een nieuwe blok-blob waarin de inhoud van de blob wordt gelezen uit een bepaalde URL:

Deze methoden hebben de voorkeur voor scenario's waarin u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben.

Voor grote objecten kunt u ervoor kiezen om met afzonderlijke blokken te werken. Met de volgende methode wordt de Put Block From URL REST API-bewerking verpakt. Met deze methode maakt u een nieuw blok dat moet worden doorgevoerd als onderdeel van een blob waarin de inhoud wordt gelezen uit een bron-URL:

Een blob kopiëren vanuit een bron in Azure

Als u een blob kopieert vanuit een bron in Azure, kan toegang tot de bron-blob worden geautoriseerd via Microsoft Entra ID, een SHARED Access Signature (SAS) of een accountsleutel.

In het volgende voorbeeld ziet u een scenario voor het kopiëren van een bron-blob in Azure. De methode upload_blob_from_url kan desgewenst een Booleaanse parameter accepteren om aan te geven of een bestaande blob moet worden overschreven, zoals wordt weergegeven in het voorbeeld.

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)

Een blob kopiëren van een bron buiten Azure

U kunt een kopieerbewerking uitvoeren op elk bronobject dat kan worden opgehaald via een HTTP GET-aanvraag op een bepaalde URL, inclusief toegankelijke objecten buiten Azure. In het volgende voorbeeld ziet u een scenario voor het kopiëren van een blob vanuit een toegankelijke bronobject-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)

Een blob asynchroon kopiëren vanuit een URL van een bronobject

De Azure Blob Storage-clientbibliotheek voor Python ondersteunt het asynchroon kopiëren van een blob vanuit een bron-URL. Zie Asynchrone programmering voor meer informatie over de vereisten voor het instellen van projecten.

Volg deze stappen om een blob uit een bronobject-URL te kopiëren met behulp van asynchrone API's:

  1. Voeg de volgende importinstructies toe:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobClient
    
  2. Voeg code toe om het programma uit te voeren met behulp van asyncio.run. Met deze functie wordt de doorgegeven coroutine uitgevoerd in main() ons voorbeeld en wordt de asyncio gebeurtenislus beheerd. Coroutines worden gedeclareerd met de syntaxis async/await. In dit voorbeeld maakt de main() coroutine eerst het hoogste niveau BlobServiceClient met behulp van async withen roept vervolgens de methode aan waarmee een blob wordt gekopieerd van een bron-URL. Houd er rekening mee dat alleen de client op het hoogste niveau moet worden gebruikt async with, omdat andere clients die ermee zijn gemaakt, dezelfde verbindingsgroep delen.

    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. Voeg code toe om een blob uit een bron-URL te kopiëren. Het volgende codevoorbeeld is hetzelfde als het synchrone voorbeeld, behalve dat de methode wordt gedeclareerd met het async trefwoord en het trefwoord wordt gebruikt bij het await aanroepen van de upload_blob_from_url methode.

    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)
    

Met deze basisinstallatie kunt u andere voorbeelden in dit artikel implementeren als coroutines met behulp van async/await syntaxis.

Resources

Zie de volgende resources voor meer informatie over het kopiëren van blobs met behulp van de Azure Blob Storage-clientbibliotheek voor Python.

Codevoorbeelden

  • Synchrone of asynchrone codevoorbeelden weergeven uit dit artikel (GitHub)

REST API-bewerkingen

De Azure SDK voor Python bevat bibliotheken die zijn gebaseerd op de Azure REST API, zodat u kunt communiceren met REST API-bewerkingen via bekende Python-paradigma's. De clientbibliotheekmethoden die in dit artikel worden behandeld, gebruiken de volgende REST API-bewerkingen:

Clientbibliotheekbronnen

  • Dit artikel maakt deel uit van de ontwikkelaarshandleiding voor Blob Storage voor Python. Zie de volledige lijst met artikelen over ontwikkelaarshandleidingen in Uw Python-app bouwen voor meer informatie.