Prüfen, ob ein Blob in Azure Storage vorhanden
-
27-09-2019 - |
Frage
Ich habe eine sehr einfache Frage bekam (ich hoffe!) - ich will nur herausfinden, ob ein Blob (mit einem Namen I definiert haben) in einem bestimmten Behälter vorhanden ist. Ich werde es sein das Herunterladen, wenn es vorhanden ist, und wenn es dann nicht tut, werde ich etwas anderes tun.
Ich habe einige der Suche auf den intertubes getan und anscheinend gibt verwendet eine Funktion namens DoesExist oder etwas ähnliches zu sein ... aber wie bei so vielen der Azure-APIs, dies scheint nicht mehr da zu sein (oder wenn es , hat einen sehr geschickt getarnt Namen).
Lösung
Die neue API hat den .Exists (Funktionsaufruf). So stellen Sie sicher, dass Sie die GetBlockBlobReference
verwenden, die den Anruf nicht an den Server durchführt. Es macht die Funktion so einfach wie:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
Andere Tipps
Hinweis: Diese Antwort ist jetzt veraltet aus. Bitte beachten Sie Richard Antwort für eine einfache Möglichkeit, um die Existenz zu prüfen
Nein, ich bin nicht etwas einfach fehlt ... haben wir einen guten Job diese Methode in der neuen StorageClient Bibliothek zu verstecken. :)
Ich schrieb einen Blog-Post Ihre Frage zu beantworten:
lame Scheinen, die Sie benötigen, eine Ausnahme zu fangen, es zu testen das Blob vorhanden ist. public static bool Exists(this CloudBlob blob)
{
try
{
blob.FetchAttributes();
return true;
}
catch (StorageClientException e)
{
if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
{
return false;
}
else
{
throw;
}
}
}
Wenn der Blob öffentlich ist, kann man natürlich nur eine HTTP HEAD-Anforderung senden - von einem der Myriaden von Sprachen / Umgebungen / Plattformen, die wissen, wie man das tun -. Und die Antwort überprüfen
Der Kern Azure APIs sind RESTful XML-basierte HTTP-Schnittstellen. Die StorageClient Bibliothek ist eine von vielen möglichen Wrapper um sie herum. Hier ist eine andere, dass Sriram Krishnan in Python hat:
http: //www.sriramkrishnan. com / blog / 2008/11 / python-Wrapper-for-windows-azure.html
Es zeigt auch, wie bei der HTTP-Ebene zu authentifizieren.
Ich habe eine ähnliche Sache für mich in C # getan, weil ich lieber Azure durch die Linse von HTTP / REST anstatt durch die Linse der StorageClient Bibliothek zu sehen. Für eine ganze Weile ich nicht einmal die Mühe gemacht hatte eine ExistsBlob Methode zu implementieren. Alle meine Kleckse waren öffentlich, und es war trivial HTTP HEAD zu tun.
Die neue Windows Azure Storage-Bibliothek enthält bereits den Exist () -Methode. Es ist in der Microsoft.WindowsAzure.Storage.dll.
Erhältlich als NuGet Paket
Erstellt von: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1
Wenn Sie nicht wie mit der Ausnahme Methode dann der grundlegende c # Version von dem, was Judell schlägt unten. Beachten Sie jedoch, dass Sie sollten wirklich andere mögliche Reaktionen behandeln.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
Mit dem aktualisierten SDK, sobald Sie die CloudBlobReference haben Sie anrufen können exists () auf Ihrer Referenz.
Das ist die Art, wie ich es tun. Angezeigt vollständigen Code für diejenigen, die es brauchen.
// 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.
}
Obwohl die meisten Antworten hier sind technisch korrekt, die meisten Codebeispiele machen synchron / Sperrung Anrufe. Es sei denn, Sie von einer sehr alten Plattform oder Code-Basis gebunden sind, HTTP Anrufe sollte immer werden asynchonously getan, und das SDK unterstützt es vollständig in diesem Fall. Verwenden Sie einfach ExistsAsync()
statt Exists()
.
bool exists = await client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.ExistsAsync();
Wenn Ihr Blob ist öffentlich und Sie müssen nur Metadaten:
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