Verificação se existe um blob no Azure Storage
-
27-09-2019 - |
Pergunta
Eu tenho uma pergunta muito simples (espero!) - Eu só quero descobrir se um blob (com um nome que eu defini) existe em um contêiner específico. Vou fazer o download se existir e, se não acontecer, farei outra coisa.
Eu fiz algumas pesquisas nos intertubos e, aparentemente nome muito inteligentemente disfarçado).
Solução
A nova API possui a chamada de função .Exists (). Apenas certifique -se de usar o GetBlockBlobReference
, que não executa a chamada para o servidor. Torna a função tão fácil quanto:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}
Outras dicas
Nota: Esta resposta está desatualizada agora. Consulte a resposta de Richard para uma maneira fácil de verificar a existência
Não, você não está perdendo algo simples ... Fizemos um bom trabalho ao esconder esse método na nova biblioteca Storageclient. :)
Acabei de escrever uma postagem no blog para responder sua pergunta: http://blog.smarx.com/postss/testing-existence-of-a-windows-azure-blob.
A resposta curta é: use CloudBlob.FetchAttributes (), que faz uma solicitação de cabeça contra o blob.
Parece coxo que você precisa pegar uma exceção para testá -lo que 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;
}
}
}
Se o blob for público, é claro, basta enviar uma solicitação de cabeça HTTP - de qualquer um dos zilhões de idiomas/ambientes/plataformas que sabem como fazer isso - e verifique a resposta.
As APIs do Core Azure são interfaces HTTP baseadas em XML RESTful. A biblioteca Storageclient é uma das muitas embalagens possíveis ao seu redor. Aqui está outro que Sriram Krishnan fez em Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Ele também mostra como autenticar no nível HTTP.
Eu fiz uma coisa semelhante para mim em C#, porque prefiro ver o Azure através das lentes de HTTP/REST, e não através da lente da biblioteca Storageclient. Por um bom tempo, eu nem me incomodei em implementar um método existblob. Todos os meus bolhas eram públicos e era trivial fazer a cabeça HTTP.
A nova biblioteca de armazenamento do Windows Azure já contém o método exist (). Está no microsoft.windowszure.storage.dll.
Disponível como pacote Nuget
Criado por: Microsoft
ID: WindowsAzure.Storage
Versão: 2.0.5.1
Se você não gosta de usar o método de exceção, a versão C# básica do que Judell sugere está abaixo. Cuidado, porém, que você realmente deve lidar com outras respostas possíveis também.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
Com o SDK atualizado, depois de ter a CloudBlobreference, você pode ligar existe () em sua referência.
É assim que eu faço. Mostrando código completo para quem precisa.
// 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.
}
Embora a maioria das respostas aqui esteja tecnicamente correta, a maioria das amostras de código está fazendo chamadas síncronas/de bloqueio. A menos que você esteja vinculado por uma plataforma ou base de código muito antiga, as chamadas HTTP devem sempre ser feito de forma assíncrona, e o SDK suporta -o totalmente neste caso. Apenas use ExistsAsync()
ao invés de Exists()
.
bool exists = await client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.ExistsAsync();
Se o seu blob é público e você precisar apenas de metadados:
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