web-dev-qa-db-fra.com

Azure Storage déplacer l'objet blob vers un autre conteneur

Je recherche une approche pour déplacer un objet blob dans Azure d'un conteneur à un autre. La seule solution que j'ai trouvée consiste à utiliser la bibliothèque Azure Storage Data Movement, mais cela semble fonctionner entre différents comptes. Je souhaite déplacer l'objet blob du même compte vers un autre conteneur.

19
Aprilia1982

Voici ce qui a fonctionné pour moi (réponse modifiée après une meilleure réponse de @Deumber a été publiée):

    public async Task<CloudBlockBlob> Move(CloudBlockBlob srcBlob, CloudBlobContainer destContainer)
    {
        CloudBlockBlob destBlob;

        if (srcBlob == null)
        {
            throw new Exception("Source blob cannot be null.");
        }

        if (!destContainer.Exists())
        {
            throw new Exception("Destination container does not exist.");
        }

        //Copy source blob to destination container
        string name = srcBlob.Uri.Segments.Last();
        destBlob = destContainer.GetBlockBlobReference(name);
        await destBlob.StartCopyAsync(srcBlob);
        //remove source blob after copy is done.
        srcBlob.Delete();
        return destBlob;
    }
17
Darrelk

Je n'ai pas utilisé Azure Storage Data Movement Library mais je suis sûr que cela fonctionnera également dans le même compte de stockage.

Pour en venir à votre question, étant donné que l'opération Move n'est pas prise en charge nativement par Azure Storage, vous pouvez l'implémenter en appelant Copy Blob suivi par Delete Blob. En général, l'opération Copy est asynchrone, mais lorsqu'un objet blob est copié dans le même compte de stockage, il s'agit d'une opération synchrone, c'est-à-dire que la copie se produit instantanément. Veuillez voir l'exemple de code ci-dessous qui fait exactement cela:

    static void MoveBlobInSameStorageAccount()
    {
        var cred = new StorageCredentials(accountName, accountKey);
        var account = new CloudStorageAccount(cred, true);
        var client = account.CreateCloudBlobClient();
        var sourceContainer = client.GetContainerReference("source-container-name");
        var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name");
        var destinationContainer = client.GetContainerReference("destination-container-name");
        var destinationBlob = destinationContainer.GetBlockBlobReference("blob-name");
        destinationBlob.StartCopy(sourceBlob);
        sourceBlob.Delete(DeleteSnapshotsOption.IncludeSnapshots);
    }

Cependant, gardez à l'esprit que vous n'utilisez ce code que pour déplacer des objets blob dans le même compte de stockage. Pour déplacer des objets blob sur un compte de stockage, vous devez vous assurer que l'opération de copie est terminée avant de supprimer l'objet blob source.

26
Gaurav Mantri

La réponse acceptée dans cette question déplacera le fichier dans la mémoire de votre serveur, puis téléchargera à nouveau le fichier sur Azure.

Il vaut mieux laisser le travail à Azure

CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient();
    CloudBlobContainer sourceContainer = blobClient.GetContainerReference(SourceContainer);
    CloudBlobContainer targetContainer = blobClient.GetContainerReference(TargetContainer);

    CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(fileToMove);
    CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(newFileName);
                    await targetBlob.StartCopyAsync(sourceBlob);
18
RJardines