Fazendo o upload de arquivo para o Windows Azure BLOB Storage

Olá pessoal,

Tenho notado um cenário bastante comum de aplicações que é a necessidade de fazer upload de informações para o Windows Azure BLOB Storage, então resolvi fazer um post sobre o assunto mostrando um exemplo e ir explicando os seus passos.

O primeiro passo necessário é acessar uma conta do Storage, que é feito conforme abaixo:

 CloudStorageAccount storageAccount = 
    CloudStorageAccount.Parse(connectionString);

Notem que uma connection string é necessária e ela pode variar de acordo com o ambiente que o código rodar. No ambiente local de desenvolvimento, utilizando o storage emulator, a string será “UseDevelopmentStorage=true”. Já no ambiente de produção do Windows Azure ela deve ter um formato similar ao seguinte “DefaultEndpointsProtocol=https;AccountName=<Sua Conta>;AccountKey=<Sua Chave>”, notem o uso do https, bastante recomendado para comunicação através da internet.

Para saber qual a sua chave de acesso ao Windows Azure Storage, acesse o portal https://windows.azure.com com a sua conta, escolha a opção de storage e visualize a primary ou a secondary key do lado direito, conforme print abaixo:

image

Depois disso, precisamos instanciar um CloudBlobClient para ter acesso ao Container, que precisamos garantir que existe e depois ter acesso ao Blob em si:

CloudBlobClient blobClient =
    storageAccount.CreateCloudBlobClient();
CloudBlobContainer container =
    new CloudBlobContainer(containerUri.ToLower(), blobClient);

container.CreateIfNotExist();

CloudBlob blob = container.GetBlobReference(
    Path.GetFileName(filePath.ToLower()));

Notem que chamo o método CreateIrNotExist do container, assim garanto que ele sempre existirá antes de tentar gravar algum Blob dentro dele.

Depois de ter a instância do Blob para trabalhar, posso fazer upload algum conteúdo:

 blob.UploadFile(filePath);

Um ponto importante que precisa ser notado, é que todas as referências de endereço nos Blobs e Containers precisam ser lowercase, garanto isso chamando o método ToLower em todas as Uris.

O código completo ficaria assim:

CloudStorageAccount storageAccount =
    CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient =
    storageAccount.CreateCloudBlobClient();
CloudBlobContainer container =
    new CloudBlobContainer(containerUri.ToLower(), blobClient);
container.CreateIfNotExist();
CloudBlob blob = container.GetBlobReference(
    Path.GetFileName(filePath.ToLower()));
blob.UploadFile(filePath);

RG