Delen via


Een blob kopiëren met asynchrone planning met behulp van TypeScript

In dit artikel wordt beschreven hoe u een blob kopieert met asynchrone planning met behulp van de Azure Storage-clientbibliotheek voor JavaScript. 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. U kunt ook een in behandeling zijnde kopieerbewerking afbreken.

De clientbibliotheekmethoden die in dit artikel worden behandeld, maken gebruik van de bewerking Blob REST API kopiëren en kunnen worden gebruikt wanneer u een kopie wilt uitvoeren met asynchrone planning. Voor de meeste kopieerscenario's waarin u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben, raadpleegt u Een blob kopiëren vanuit een url van een bronobject met TypeScript.

Vereisten

  • In de voorbeelden in dit artikel wordt ervan uitgegaan dat u al een project hebt ingesteld voor gebruik met de Azure Blob Storage-clientbibliotheek voor JavaScript. Zie Aan de slag met Azure Blob Storage en TypeScript voor meer informatie over het instellen van uw project, inclusief pakketinstallatie, het importeren van modules en het maken van een geautoriseerd clientobject voor gebruik met gegevensbronnen.
  • Het autorisatiemechanisme moet machtigingen hebben om een kopieerbewerking uit te voeren of om een in behandeling zijnde kopie af te breken. Zie de autorisatierichtlijnen voor de volgende REST API-bewerking voor meer informatie:

Over het kopiëren van blobs met asynchrone planning

De Copy Blob bewerking kan asynchroon worden voltooid en wordt uitgevoerd op basis van best effort, wat betekent dat de bewerking niet gegarandeerd onmiddellijk of binnen een opgegeven tijdsbestek wordt gestart of voltooid. De kopieerbewerking wordt op de achtergrond gepland en uitgevoerd als de server beschikbare resources heeft. De bewerking kan synchroon worden voltooid als de kopie plaatsvindt binnen hetzelfde opslagaccount.

Een Copy Blob bewerking kan een van de volgende acties uitvoeren:

  • Kopieer een bron-blob naar een doel-blob met een andere naam. De doel-blob kan een bestaande blob zijn van hetzelfde blobtype (blok, toevoeg of pagina), of kan een nieuwe blob zijn die is gemaakt door de kopieerbewerking.
  • Kopieer een bron-blob naar een doel-blob met dezelfde naam, waardoor de doel-blob wordt vervangen. Met dit type kopieerbewerking worden eventuele niet-doorgevoerde blokken verwijderd en worden de metagegevens van de doel-blob overschreven.
  • Kopieer een bronbestand in de Azure File-service naar een doel-blob. De doel-blob kan een bestaande blok-blob zijn of kan een nieuwe blok-blob zijn die is gemaakt door de kopieerbewerking. Kopiëren van bestanden naar pagina-blobs of toevoeg-blobs wordt niet ondersteund.
  • Kopieer een momentopname over de basis-blob. Door een momentopname te promoveren naar de positie van de basis-blob, kunt u een eerdere versie van een blob herstellen.
  • Kopieer een momentopname naar een doel-blob met een andere naam. De resulterende doel-blob is een beschrijfbare blob en geen momentopname.

Zie Blob-opmerkingen kopiëren voor meer informatie over de Copy Blob bewerking, waaronder informatie over eigenschappen, indextags, metagegevens en facturering.

Een blob kopiëren met asynchrone planning

In deze sectie vindt u een overzicht van methoden die worden geboden door de Azure Storage-clientbibliotheek voor JavaScript en TypeScript voor het uitvoeren van een kopieerbewerking met asynchrone planning.

Met de volgende methoden wordt de rest API-bewerking voor kopiëren blob verpakt en wordt een asynchrone kopie van gegevens uit de bron-blob gestart:

De beginCopyFromURL methode retourneert een poller voor langdurige bewerkingen waarmee u voor onbepaalde tijd kunt wachten totdat de kopie is voltooid.

Een blob kopiëren vanuit een bron in Azure

Als u een blob in hetzelfde opslagaccount kopieert, kan de bewerking synchroon worden voltooid. Toegang tot de bron-blob kan worden geautoriseerd via Microsoft Entra ID, een Shared Access Signature (SAS) of een accountsleutel. Zie Een blob kopiëren van een bronobject-URL met TypeScript voor een alterative synchrone kopieerbewerking.

Als de kopieerbron een blob in een ander opslagaccount is, kan de bewerking asynchroon worden voltooid. De bron-blob moet openbaar of geautoriseerd zijn via een SAS-token. Het SAS-token moet de machtiging Lezen ('r') bevatten. Zie Toegang delegeren met handtekeningen voor gedeelde toegang voor meer informatie over SAS-tokens.

In het volgende voorbeeld ziet u een scenario voor het kopiëren van een bronblob uit een ander opslagaccount met asynchrone planning. In dit voorbeeld maken we een bron-blob-URL met een toegevoegd SAS-token voor gebruikersdelegering. In het voorbeeld ziet u hoe u het SAS-token genereert met behulp van de clientbibliotheek, maar u kunt ook uw eigen token opgeven. In het voorbeeld ziet u ook hoe u de bron-blob tijdens de kopieerbewerking kunt leasen om wijzigingen in de blob van een andere client te voorkomen. Met Copy Blob de bewerking wordt de ETag waarde van de bron-blob opgeslagen wanneer de kopieerbewerking wordt gestart. Als de ETag waarde wordt gewijzigd voordat de kopieerbewerking is voltooid, mislukt de bewerking.

async function copyAcrossStorageAccountsAsync(
  sourceBlob: BlockBlobClient,
  destinationBlob: BlockBlobClient,
  blobServiceClient: BlobServiceClient
): Promise<void> {
  const sourceBlobLease = new BlobLeaseClient(sourceBlob);

  // Create a SAS token that's valid for 1 hour
  const sasToken = await generateUserDelegationSAS(sourceBlob, blobServiceClient);
  const sourceBlobSASURL: string = sourceBlob.url + '?' + sasToken;

  try {
    await sourceBlobLease.acquireLease(-1);

    const copyPoller = await destinationBlob.beginCopyFromURL(sourceBlobSASURL);
    await copyPoller.pollUntilDone();
  } catch (error) {
    console.log(error);
  } finally {
    await sourceBlobLease.releaseLease();
  }
}

async function generateUserDelegationSAS(
  sourceBlob: BlockBlobClient,
  blobServiceClient: BlobServiceClient
): Promise<string> {
  // Get a user delegation key for the Blob service that's valid for 1 hour, as an example
  const delegationKeyStart = new Date();
  const delegationKeyExpiry = new Date(Date.now() + 3600000);
  const userDelegationKey = await blobServiceClient.getUserDelegationKey(
    delegationKeyStart,
    delegationKeyExpiry
  );

  // Create a SAS token that's valid for 1 hour, as an example
  const sasTokenStart = new Date();
  const sasTokenExpiry = new Date(Date.now() + 3600000);
  const blobName = sourceBlob.name;
  const containerName = sourceBlob.containerName;
  const sasOptions = {
    blobName,
    containerName,
    permissions: BlobSASPermissions.parse("r"),
    startsOn: sasTokenStart,
    expiresOn: sasTokenExpiry,
    protocol: SASProtocol.HttpsAndHttp
  };

  const sasToken = generateBlobSASQueryParameters(
    sasOptions,
    userDelegationKey,
    blobServiceClient.accountName
  ).toString();

  return sasToken.toString();
}

Notitie

SAS-tokens voor gebruikersdelegatie bieden meer beveiliging, omdat ze zijn ondertekend met Microsoft Entra-referenties in plaats van een accountsleutel. Voor het maken van een SAS-token voor gebruikersdelegering heeft de Microsoft Entra-beveiligingsprincipaal de juiste machtigingen nodig. Zie Sleutel voor gebruikersdelegering ophalen voor autorisatievereisten.

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.

async function copyFromExternalSource(sourceURL: string,
  destinationBlob: BlockBlobClient
): Promise<void> {
  try {
    const copyPoller = await destinationBlob.beginCopyFromURL(sourceURL);
    await copyPoller.pollUntilDone();
  } catch (error) {
    console.log(error);
  }
}

De status van een kopieerbewerking controleren

Als u de status van een asynchrone Copy Blob bewerking wilt controleren, kunt u de methode getProperties peilen en de kopieerstatus controleren.

In het volgende codevoorbeeld ziet u hoe u de status van een kopieerbewerking in behandeling controleert:

async function checkCopyStatus(destinationBlob: BlockBlobClient): Promise<void> {
  const properties = await destinationBlob.getProperties();
  console.log(properties.copyStatus);
}

Een kopieerbewerking afbreken

Het afbreken van een in behandeling zijnde Copy Blob bewerking resulteert in een doel-blob met een lengte van nul. De metagegevens voor de doel-blob bevatten echter de nieuwe waarden die uit de bron-blob zijn gekopieerd of expliciet zijn ingesteld tijdens de kopieerbewerking. Als u de oorspronkelijke metagegevens van vóór de kopie wilt bewaren, maakt u een momentopname van de doel-blob voordat u een van de kopieermethoden aanroept.

Als u een kopieerbewerking in behandeling wilt afbreken, roept u de volgende bewerking aan:

Met deze methode wordt de bewerking Abort Copy Blob REST API verpakt, waardoor een bewerking in behandeling Copy Blob wordt geannuleerd. In het volgende codevoorbeeld ziet u hoe u een bewerking in behandeling Copy Blob kunt afbreken:

async function abortCopy(destinationBlob: BlockBlobClient): Promise<void> {
  const properties = await destinationBlob.getProperties();

  // Check the copy status and abort if pending
  if (properties.copyStatus === "pending") {
    await destinationBlob.abortCopyFromURL(properties.copyId?.toString()!);
  }
}

Resources

Zie de volgende resources voor meer informatie over het kopiëren van blobs met asynchrone planning met behulp van de Azure Blob Storage-clientbibliotheek voor JavaScript en TypeScript.

REST API-bewerkingen

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

  • Blob kopiëren (REST API)
  • Blob kopiëren afbreken (REST API)

Codevoorbeelden

Clientbibliotheekbronnen