web-dev-qa-db-ja.com

Azure StorageにBLOBが存在するかどうかを確認する

非常に簡単な質問があります(願っています!)-特定のコンテナに(定義した名前の)BLOBが存在するかどうかを知りたいだけです。存在する場合はダウンロードし、存在しない場合は別のことを行います。

私はインターチューブでいくつかの検索を行ったが、明らかにDosExistまたは類似のものと呼ばれる関数がありました...しかし、Azure APIの多くと同様に、これはもはや存在しないようです(または存在する場合非常に巧妙に変装した名前)。

117
John

新しいAPIには、.Exists()関数呼び出しがあります。サーバーへの呼び出しを実行しないGetBlockBlobReferenceを使用していることを確認してください。次のように機能を簡単にします。

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

注:この回答は現在古くなっています。存在を確認する簡単な方法については、リチャードの回答を参照してください

いいえ、あなたは単純なものを見逃していません...新しいStorageClientライブラリでこのメソッドを非表示にするのに良い仕事をしました。 :)

http://blog.smarx.com/posts/testing-existence-of-a-windows-Azure-blob

簡単な答えは次のとおりです。CloudBlob.FetchAttributes()を使用します。これはblobに対してHEAD要求を行います。

49
smarx

Blobが存在することをテストするために例外をキャッチする必要があると思われます。

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

BLOBが公開されている場合は、もちろん、HTTP HEADリクエストを送信することができます-それを行う方法を知っている無数の言語/環境/プラットフォームのいずれかから-応答を確認する。

コアAzure APIは、RESTful XMLベースのHTTPインターフェイスです。 StorageClientライブラリは、それらを取り巻く多くの可能なラッパーの1つです。 Sriram KrishnanがPythonで行ったことは次のとおりです。

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

また、HTTPレベルで認証する方法も示します。

StorageClientライブラリのレンズを通してよりもHTTP/RESTのレンズを通してAzureを見るのが好きなので、私はC#で同様のことを自分で行いました。かなり長い間、私はExistsBlobメソッドを実装することさえしませんでした。すべてのBLOBはパブリックであり、HTTP HEADを実行するのは簡単でした。

9
judell

新しいWindows Azureストレージライブラリには、Exist()メソッドが既に含まれています。 Microsoft.WindowsAzure.Storage.dllにあります。

NuGetパッケージとして利用可能
作成者:Microsoft
Id:WindowsAzure.Storage
バージョン:2.0.5.1

msdnも参照

5
huha

例外メソッドを使用したくない場合は、judellが提案する基本的なc#バージョンを以下に示します。ただし、他の考えられる応答も実際に処理する必要があることに注意してください。

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

ここでの回答のほとんどは技術的に正しいものですが、ほとんどのコードサンプルは同期/ブロッキング呼び出しを行っています。非常に古いプラットフォームまたはコードベースに縛られていない限り、HTTP呼び出しはalways非同期で行われる必要があり、SDKはこの場合に完全にサポートします。 ExistsAsync()の代わりにExists()を使用してください。

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

これが私のやり方です。必要な人に完全なコードを表示します。

        // 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.
        }
1
Apollo

更新されたSDKでは、CloudBlobReferenceを取得したら、参照でExists()を呼び出すことができます。

http://msdn.Microsoft.com/en-us/library/Microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx を参照してください

1
Babak Naffas

BLOBがパブリックであり、メタデータのみが必要な場合:

        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