Copiare un BLOB da un URL dell'oggetto di origine con Python

Questo articolo illustra come copiare un BLOB da un URL dell'oggetto di origine usando la libreria client di Archiviazione di Azure per Python. È possibile copiare un BLOB da un'origine all'interno dello stesso account di archiviazione, da un'origine in un account di archiviazione diverso o da qualsiasi oggetto accessibile recuperato tramite una richiesta HTTP GET in un determinato URL.

I metodi della libreria client illustrati in questo articolo usano le operazioni dell'API REST Put Blob from URL e Put Block From URL. Questi metodi sono preferiti per gli scenari di copia in cui si desidera spostare i dati in un account di archiviazione e avere un URL per l'oggetto di origine. Per le operazioni di copia in cui si desidera una pianificazione asincrona, vedere Copiare un BLOB con pianificazione asincrona usando Python.

Per informazioni sulla copia di BLOB tramite API asincrone, vedere Copiare un BLOB da un URL dell'oggetto di origine in modo asincrono.

Prerequisiti

Configurazione dell'ambiente

Se non si dispone di un progetto esistente, questa sezione illustra come configurare un progetto per l’uso con la libreria client di Archiviazione BLOB di Azure per Python. Per altre informazioni, vedere Introduzione ad Archiviazione BLOB di Azure e Python.

Per usare gli esempi di codice in questo articolo, seguire questa procedura per configurare il progetto.

Installare i pacchetti

Installare i pacchetti seguenti tramite pip install:

pip install azure-storage-blob azure-identity

Aggiungere le istruzioni di importazione

Aggiungere le istruzioni import seguenti:

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

Autorizzazione

Il meccanismo di autorizzazione deve disporre delle autorizzazioni necessarie per eseguire un'operazione di copia. Per l'autorizzazione con Microsoft Entra ID (scelta consigliata), è necessario disporre del ruolo predefinito di Controllo degli accessi in base al ruolo di Azure Collaboratore ai dati del BLOB di archiviazione o ruolo superiore. Per altre informazioni, vedere le indicazioni sulle autorizzazioni per Put Blob From URL (API REST) o Put Block From URL (API REST).

Creare un oggetto client

Per connettere un'app ad Archiviazione BLOB, creare un'istanza di BlobServiceClient. Nell'esempio seguente viene illustrato come creare un oggetto client usando DefaultAzureCredential per l'autorizzazione:

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

È anche possibile creare oggetti client per contenitori o BLOB specifici, direttamente o dall'oggetto BlobServiceClient. Per altre informazioni sulla creazione e la gestione di oggetti client, vedere Creare e gestire oggetti client che interagiscono con le risorse dati.

Informazioni sulla copia di BLOB da un URL dell'oggetto di origine

L'operazione Put Blob From URL crea un nuovo BLOB in blocchi in cui il contenuto del BLOB viene letto da un URL specificato. L'operazione viene completata in modo sincrono.

L'origine può essere qualsiasi oggetto recuperabile tramite una richiesta HTTP GET standard nell'URL specificato. Ciò include BLOB in blocchi, BLOB di accodamento, BLOB di pagine, snapshot di BLOB, versioni di BLOB o qualsiasi oggetto accessibile all'interno o all'esterno di Azure.

Quando l'oggetto di origine è un BLOB in blocchi, tutto il contenuto dei BLOB di cui è stato eseguito il commit viene copiato. Il contenuto del BLOB di destinazione è identico al contenuto dell'origine, ma l'elenco dei blocchi di cui è stato eseguito il commit non viene mantenuto e i blocchi di cui non è stato eseguito il commit non vengono copiati.

La destinazione è sempre un BLOB in blocchi, preesistente oppure creato dall'operazione. Il contenuto di un BLOB esistente viene sovrascritto con il contenuto del nuovo BLOB.

L'operazione Put Blob From URL copia sempre l'intero BLOB di origine. La copia di un intervallo di byte o di un set di blocchi non è supportata. Per eseguire aggiornamenti parziali del contenuto di un BLOB in blocchi usando un URL di origine, usare l'API Put Block From URL insieme a Put Block List.

Per altre informazioni sull'operazione Put Blob From URL, incluse le limitazioni delle dimensioni dei BLOB e considerazioni sulla fatturazione, vedere Commenti su Put Blob from URL.

Copiare un BLOB da un URL dell'oggetto di origine

Questa sezione offre una panoramica dei metodi forniti dalla libreria client di Archiviazione di Azure per Python per eseguire un'operazione di copia da un URL dell'oggetto di origine.

Il metodo seguente esegue il wrapping dell'operazione dell’API REST Put Blob from URL e crea un nuovo BLOB in blocchi in cui il contenuto viene letto da un URL specificato:

Questi metodi sono preferiti per gli scenari in cui si desidera spostare i dati in un account di archiviazione e avere un URL per l'oggetto di origine.

Per oggetti di grandi dimensioni, è possibile lavorare con singoli blocchi. Il metodo seguente esegue il wrapping dell'operazione dell’API REST Put Block From URL. Questo metodo crea un nuovo blocco di cui eseguire il commit come parte di un BLOB in cui il contenuto viene letto da un URL di origine:

Copiare un BLOB da un'origine all’interno di Azure

Se si copia un BLOB da un'origine all'interno di Azure, l'accesso al BLOB di origine può essere autorizzato tramite Microsoft Entra ID, una firma di accesso condiviso (SAS) o una chiave dell'account.

L'esempio seguente illustra uno scenario per la copia da un BLOB di origine all’interno di Azure. Il metodo upload_blob_from_url può accettare facoltativamente un parametro booleano per indicare se un BLOB esistente deve essere sovrascritto, come illustrato nell'esempio.

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)

Copiare un BLOB da un'origine all'esterno di Azure

È possibile eseguire un'operazione di copia su qualsiasi oggetto di origine recuperabile tramite una richiesta HTTP GET in un determinato URL, inclusi gli oggetti accessibili all'esterno di Azure. L'esempio seguente illustra uno scenario per la copia di un BLOB da un URL dell'oggetto di origine accessibile.

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)

Copiare un BLOB da un URL dell'oggetto di origine in modo asincrono

La libreria client di Archiviazione BLOB di Azure per Python supporta la copia di un BLOB da un URL di origine in modo asincrono. Per altre informazioni sui requisiti di configurazione del progetto, consultare Programmazione asincrona.

Seguire questa procedura per copiare un BLOB da un URL dell'oggetto di origine usando le API asincrone:

  1. Aggiungere le seguenti istruzioni Import:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobClient
    
  2. Aggiungere il codice per eseguire il programma utilizzando asyncio.run. Questa funzione esegue la coroutine passata, main() nell'esempio, e gestisce il ciclo di eventi asyncio. Le coroutine vengono dichiarate con la sintassi async/await. In questo esempio la coroutine main() crea innanzitutto il primo livello di BlobServiceClient usando async with, quindi chiama il metodo che copia un BLOB da un URL di origine. Si noti che soltanto il client di primo livello deve utilizzare async with, poiché gli altri client da esso creati condividono lo stesso pool di connessioni.

    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. Aggiungere il codice per copiare un BLOB da un URL di origine. Il seguente esempio di codice è uguale a quello dell'esempio sincrono, ad eccezione del fatto che il metodo viene dichiarato con la parola chiave async e che quando si richiama il metodo upload_blob_from_url si utilizza la parola chiave 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)
    

Con questa configurazione di base, nel presente articolo è possibile implementare altri esempi come coroutine, utilizzando la sintassi async/await.

Risorse

Per altre informazioni sulla copia di BLOB con la libreria client di Archiviazione BLOB di Azure per Python, vedere le risorse seguenti.

Esempi di codice

Operazioni dell'API REST

Azure SDK per Python contiene librerie basate su API REST di Azure che consentono di interagire con le operazioni API REST tramite paradigmi Python noti. I metodi della libreria client illustrati in questo articolo usano le operazioni API REST seguenti:

Risorse della libreria client

  • Questo articolo fa parte della Guida per sviluppatori di Archiviazione BLOB per Python. Per altre informazioni, vedere l’elenco completo degli articoli della Guida per sviluppatori in Creare la propria app Python.