web-dev-qa-db-fra.com

Vérification de l'existence d'un blob dans Azure Storage

J'ai une question très simple (j'espère!) - je veux juste savoir si un blob (avec un nom que j'ai défini) existe dans un conteneur particulier. Je le téléchargerai s'il existe, et si ce n'est pas le cas, je ferai autre chose.

J'ai effectué quelques recherches sur les intertubes et apparemment, il existait une fonction appelée DoesExist ou quelque chose de similaire ... nom très habilement déguisé).

112
John

La nouvelle API a l'appel de fonction .Exists (). Assurez-vous simplement que vous utilisez la variable GetBlockBlobReference, qui n’effectue pas l’appel au serveur. Cela rend la fonction aussi simple que:

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}
181
Richard

Note: Cette réponse est obsolète maintenant. S'il vous plaît voir la réponse de Richard pour un moyen facile de vérifier l'existence

Non, il ne vous manque pas quelque chose de simple ... nous avons bien caché cette méthode dans la nouvelle bibliothèque StorageClient. :)

Je viens d'écrire un article sur le blog pour répondre à votre question: http://blog.smarx.com/posts/testing-existence-of-a-windows-Azure-blob .

La réponse courte est: utilisez CloudBlob.FetchAttributes (), qui fait une demande HEAD contre le blob.

49
smarx

Vous semblez boiteux qu'il vous faille attraper une exception pour vérifier si le blob existe.

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}
16
nathanw

Si le blob est public, vous pouvez bien sûr simplement envoyer une demande HTTP HEAD - à partir de l'un des zillions de langages/environnements/plates-formes qui savent comment procéder - et vérifier la réponse.

Les API Azure principales sont des interfaces HTTP basées sur XML RESTful. La bibliothèque StorageClient est l’un des nombreux wrappers possibles autour d’elle. Voici une autre chose que Sriram Krishnan a faite en Python:

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-Azure.html

Il montre également comment s'authentifier au niveau HTTP.

J'ai fait la même chose en C #, car je préfère voir Azure à travers l'objectif de HTTP/REST plutôt que de celui de la bibliothèque StorageClient. Pendant longtemps, je n'avais même pas pris la peine d'implémenter une méthode ExistsBlob. Toutes mes tâches étaient publiques et il était trivial de faire HTTP HEAD.

9
judell

La nouvelle bibliothèque de stockage Windows Azure contient déjà la méthode Exist () . Elle se trouve dans Microsoft.WindowsAzure.Storage.dll.

Disponible en tant que paquet NuGet
Créé par: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1

Voir aussi msdn

5
huha

Si vous n'aimez pas utiliser la méthode d'exception, la version de base en c # de ce que suggère judell est ci-dessous. Attention, vous devez également gérer d’autres réponses possibles.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
    return true;
}
else
{
    return false;
}
1
Mad Pierre

Avec le SDK mis à jour, une fois que vous avez le CloudBlobReference, vous pouvez appeler Exists () sur votre référence.

Voir http://msdn.Microsoft.com/en-us/library/Microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

1
Babak Naffas

Bien que la plupart des réponses ici soient techniquement correctes, la plupart des exemples de code effectuent des appels synchrones/bloquants. À moins que vous ne soyez liés par une très ancienne plateforme ou base de code, les appels HTTP doivent toujours être effectués de manière asynchrone et le SDK les prend pleinement en charge dans ce cas. Utilisez simplement ExistsAsync() au lieu de Exists().

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();
0
Todd Menier

C'est comme ça que je le fais. Afficher le code complet pour ceux qui en ont besoin.

        // Parse the connection string and return a reference to the storage account.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("ContainerName");

        // Retrieve reference to a blob named "test.csv"
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.csv");

        if (blockBlob.Exists())
        {
          //Do your logic here.
        }
0
Apollo

Si votre blob est public et que vous n'avez besoin que de métadonnées:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "HEAD";
        string code = "";
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            code = response.StatusCode.ToString();
        }
        catch 
        {
        }

        return code; // if "OK" blob exists
0
emert117