it-roy-ru.com

Проверка наличия большого двоичного объекта в хранилище Azure

У меня очень простой вопрос (я надеюсь!) - я просто хочу выяснить, существует ли BLOB-объект (с именем, которое я определил) в конкретном контейнере. Я буду загружать его, если он существует, а если его нет, я сделаю что-то еще.

Я провел некоторый поиск по внутренним каналам и, по-видимому, раньше была функция с именемDoExist или что-то подобное ... но, как и во многих API Azure, этого больше не существует (или, если это так, есть очень хитро замаскированное имя).

112
John

Новый API имеет вызов функции .Exists (). Просто убедитесь, что вы используете GetBlockBlobReference, который не выполняет вызов на сервер. Это делает функцию так же просто, как:

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

Примечание. Этот ответ устарел. Пожалуйста, смотрите ответ Ричарда для простого способа проверить существование

Нет, вы не упускаете ничего простого ... мы хорошо спрятали этот метод в новой библиотеке StorageClient. :)

Я только что написал сообщение в блоге, чтобы ответить на ваш вопрос: http://blog.smarx.com/posts/testing-existence-of-a-windows-Azure-blob .

Краткий ответ: используйте CloudBlob.FetchAttributes (), который выполняет запрос 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 - с любого из множества языков/сред/платформ, которые знают, как это сделать, - и проверить ответ.

Основные API Azure - это HTTP-интерфейсы RESTful на основе XML. Библиотека StorageClient является одной из многих возможных оболочек вокруг них. Вот еще что Шрирам Кришнан сделал на Python:

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

Также показано, как пройти аутентификацию на уровне HTTP.

Я сделал то же самое для себя в C #, потому что я предпочитаю видеть Azure через линзу HTTP/REST, а не через линзу библиотеки StorageClient. В течение долгого времени я даже не удосужился реализовать метод 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

Если вам не нравится использовать метод исключения, тогда базовая версия 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;
}
1
Mad Pierre

С обновленным SDK, когда у вас есть CloudBlobReference, вы можете вызывать Exists () по вашей ссылке.

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

1
Babak Naffas

Хотя большинство ответов здесь технически правильны, большинство примеров кода выполняют синхронные/блокирующие вызовы. Если вы не связаны очень старой платформой или кодовой базой, HTTP-вызовы должны всегда выполняться асинхронно, и в этом случае SDK полностью поддерживает это. Просто используйте ExistsAsync() вместо Exists().

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();
0
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.
        }
0
Apollo

Если ваш блоб общедоступен и вам нужны только метаданные:

        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