Vérification de l'existence d'un blob dans le stockage Azure
J'ai une question très simple (j'espère!) - Je veux juste savoir si une goutte (avec un nom que j'ai défini) existe dans un conteneur particulier. Je vais le télécharger s'il existe, et si ce n'est pas le cas, je ferai autre chose.
J'ai fait quelques recherches sur les intertubes et apparemment il y avait une fonction appelée DoesExist ou quelque chose de similaire... mais comme avec tant D'API Azure, cela ne semble plus être là (ou si c'est le cas, a un déguisement très astucieux nom).
8 réponses
La nouvelle API a le .Exists() appel de fonction. Assurez-vous simplement d'utiliser le GetBlockBlobReference
, qui n'effectue pas l'appel au serveur. Il rend la fonction aussi facile que:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
Remarque: Cette réponse est obsolète maintenant. Veuillez consulter la réponse de Richard pour un moyen facile de vérifier l'existence
Non, vous ne manquez pas quelque chose de simple... nous avons fait un bon travail de cacher cette méthode dans la nouvelle bibliothèque StorageClient. :)
Je viens d'écrire un article de 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 effectue une requête HEAD contre BLOB.
Semble boiteux que vous ayez besoin d'attraper une exception pour le tester 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;
}
}
}
Si le blob est public, vous pouvez bien sûr envoyer une requête HTTP HEAD - à partir de l'un des millions de langages / environnements/plates-formes qui savent comment faire-et vérifier la réponse.
Les API Azure de base sont des interfaces HTTP basées sur XML RESTful. La bibliothèque StorageClient est l'un des nombreux wrappers possibles autour d'eux. Voici un autre que Sriram Krishnan a fait dans 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 une chose similaire pour moi-même en C#, parce que je préfère voir Azure à travers L'objectif de HTTP / REST plutôt que dans l'objectif de la bibliothèque StorageClient. Pendant un certain temps, je n'avais même pas pris la peine d'implémenter une méthode ExistsBlob. Tous mes blobs étaient publics, et c'était trivial de faire HTTP HEAD.
La nouvelle bibliothèque de stockage Windows Azure contient déjà la méthode Exist (). Ses dans le Microsoft.WindowsAzure.Stockage.DLL.
Disponible en tant que paquet NuGet
Créé par: Microsoft
Id: WindowsAzure.Stockage
Version: 2.0.5.1
Si vous n'aimez pas utiliser la méthode d'exception, la version C # de base de ce que judell suggère est ci-dessous. Méfiez-vous cependant que vous devriez vraiment gérer d'autres réponses possibles aussi.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
Avec le SDK mis à jour, une fois que vous avez le CloudBlobReference, vous pouvez appeler Exists() sur votre référence.
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.
}