web-dev-qa-db-de.com

Überprüfen, ob in Azure Storage ein Blob vorhanden ist

Ich habe eine sehr einfache Frage (hoffe ich!) - ich möchte nur herausfinden, ob ein Blob (mit einem von mir definierten Namen) in einem bestimmten Container vorhanden ist. Ich werde es herunterladen, falls es existiert, und wenn nicht, dann mache ich etwas anderes.

Ich habe einige Suchen in den Intertubes durchgeführt und anscheinend gab es eine Funktion namens DoesExist oder etwas Ähnliches ... aber wie bei so vielen Azure-APIs scheint diese nicht mehr vorhanden zu sein (oder, wenn ja, eine sehr geschickt getarnter Name).

112
John

Die neue API hat den Funktionsaufruf .Exists (). Stellen Sie einfach sicher, dass Sie die GetBlockBlobReference verwenden, die den Aufruf an den Server nicht ausfü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();  
}
181
Richard

Hinweis: Diese Antwort ist nicht mehr aktuell. In Richards Antwort finden Sie eine einfache Möglichkeit, die Existenz zu überprüfen.

Nein, Sie vermissen nichts einfaches ... Wir haben diese Methode in der neuen StorageClient-Bibliothek gut versteckt. :)

Ich habe gerade einen Blogeintrag geschrieben, um Ihre Frage zu beantworten: http://blog.smarx.com/posts/testing-existence-of-a-windows-Azure-blob .

Die kurze Antwort lautet: use CloudBlob.FetchAttributes (), die eine HEAD -Anforderung für den Blob ausführt.

49
smarx

Schade, dass Sie eine Ausnahme abfangen müssen, um zu testen, ob der 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;
        }
    }
}
16
nathanw

Wenn der Blob öffentlich ist, können Sie natürlich einfach eine HTTP HEAD Anforderung von einer Vielzahl von Sprachen/Umgebungen/Plattformen, die dies wissen, senden und die Antwort überprüfen.

Die wichtigsten Azure-APIs sind RESTful-XML-basierte HTTP-Schnittstellen. Die StorageClient-Bibliothek ist eine von vielen möglichen Wrapper. Hier ist ein anderer, den Sriram Krishnan in Python gemacht hat:

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

Außerdem wird gezeigt, wie Sie sich auf HTTP-Ebene authentifizieren.

Ich habe in C # ein ähnliches Verfahren vorgenommen, da ich Azure lieber durch die Linse von HTTP/REST als durch die Linse der StorageClient-Bibliothek sehe. Ich hatte mich lange Zeit nicht die Mühe gemacht, eine ExistsBlob-Methode zu implementieren. Alle meine Blobs waren öffentlich, und es war einfach, HTTP HEAD zu machen.

9
judell

Die neue Windows Azure Storage Library enthält bereits die Exist () -Methode . Sie befindet sich in der Microsoft.WindowsAzure.Storage.dll.

Verfügbar als NuGet-Paket
Erstellt von: Microsoft
Id: WindowsAzure.Storage
Version: 2.0.5.1

Siehe auch msdn

5
huha

Wenn Sie die Ausnahmemethode nicht mögen, ist die grundlegende c # -Version dessen, was judell vorschlägt. Hüten Sie sich jedoch vor, dass Sie auch mit anderen möglichen Antworten umgehen sollten.

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

Mit dem aktualisierten SDK können Sie, sobald Sie die CloudBlobReference haben, Exists () für Ihre Referenz aufrufen.

Siehe http://msdn.Microsoft.com/de-de/library/Microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

1
Babak Naffas

Obwohl die meisten Antworten hier technisch korrekt sind, führen die meisten Codebeispiele synchrone/blockierende Aufrufe aus. Wenn Sie nicht an eine sehr alte Plattform oder Codebasis gebunden sind, sollten HTTP-Aufrufe immer asynchron ausgeführt werden, und das SDK unterstützt dies in diesem Fall vollständig. Verwenden Sie einfach ExistsAsync() anstelle von Exists().

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

So mache ich es. Den vollständigen Code für diejenigen anzeigen, die ihn benötigen.

        // 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

Wenn Ihr Blob öffentlich ist und Sie nur Metadaten benötigen:

        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