Blobs com Windows Azure, armazenando e publicando arquivos

Olá a todos!

Iniciando uma série de posts sobre o Windows Azure, a plataforma de computação das nuvens da Microsoft. Vamos falar um pouco sobre armazenamento e publicação de arquivos de arquivos com Blobs.

Entenda que tudo que permeia a computação nas nuvens tem um nível de abstração muito grande, por exemplo: Na computação nas nuvens não temos o conceito de diretórios físicos nas máquinas, não podemos simplesmente dizer que o usuário poderá fazer o upload de uma foto para o diretório “c:\upload\fotos”. Da mesma maneira não podemos criar um diretório virtual e apontar links para arquivos físicos nas máquinas.

Pensando nisto a Microsoft incorporou o conceito de BLOB (Binary Large Object ou Grande Objetos Binário) a sua plataforma de computação nas nuvens a fim de resolver um problema de armazenamento de arquivos locais e ao mesmo tempo criar um meio fácil de disponibilizá-los.

1. Windows Azure Blobs

Blobs para Windows Azure basicamente consistem em arquivos binários ou textos que são armazenados dentro de containers. Estes arquivos podem conter tags (metadatas) que descrevem o arquivo ou adicionam informações a ele. Cada container pode conter um ou mais arquivos de qualquer tipo especificado e permissões especificas, podendo ser público (aonde todos consegue baixar os arquivos) ou privado (através de uma chave criada e com tempos de expiração). Os containers por sua vez ficam todos dentro da sua conta de storage do Windows Azure.  Todas as contas já vêm preparadas para trabalhar com três tipos de persistências de dados, Blobs, Filas e Tabelas (iremos tratar sobre eles posteriormente). A Figura 1 ilustra a hierarquia de armazenamento dos Blobs.

Figura 1. Windows Azure Blobs

Outro detalhe que tem de ser levado em consideração com relação aos Blobs é seu endereço de publicação.  Para todos os tipos de armazenamentos possíveis existe um endereço único que deverá ser respeitado em sua formação. Esta url endereça o acesso ao tipo de armazenamento que está sendo utilizando ao container e ao arquivo. Veja na Figura 2 que este endereço é divido em várias partes, sendo a primeira o nome da conta de armazenamento seguido do tipo de persistência escolhido e ao final temos o nome do container e o nome do arquivo.

Figura 2. Endereço de um Blob

A url da sua conta de storage poderá ser conseguida atraves do portal de gerenciamento do Windows Azure no endereço: http://windows.azure.com

2. Preparando a máquina para trabalhar

Por se tratar do primeiro artigo sobre o Windows Azure, irei falar aqui em como preparar sua máquina desenvolver para a plataforma nas nuvens.  Alguns requisitos ao primeiro momento podem parecer exagero, mas vejam que o Azure SDK é uma plataforma completa de desenvolvimento off-line, que permite aos desenvolvedores criarem e emularem o ambiente computacional das nuvens totalmente desconectado.

  • Windows Server 2008, Windows Vista ou W7
  • Visual Studio 2010 ou Visual Web Developer 2010 Express Edition
  • SQL Server 2005 ou 2008(podendo e preferencialmente o Express que acompanha o Visual Studio 2010 na instancia sqlexpress)
  • Internet Information Services 7.0 ou superior

O download poderá ser feito pelo endereço http://www.microsoft.com/windowsazure/getstarted/default.aspx clicando no botão Get Tools & SDK.

O processo é quase todo automático e sem muito segredo.

Um detalhe importante: ao iniciar o Visual Studio, é obrigatório que ele esteja em modo administrador, para isto basta clicar com o botão direito em cima do nome dele no menu é clica em Executar Como Administrador, confirmar no aviso de segurança e pronto, Conforme a Figura 3 demonstra.

Figura 3. Executando o Visual Studio como Administrador

Agora já estamos com a máquina pronta para trabalhar, vamos iniciar nossa pequena página Web hospedada nuvens.  Aqui é bom que tenhamos uma conta do Windows Azure para podermos testar, mas, caso não a tenha ainda (é possível conseguir uma conta gratuita de 30 dias no site do Windows Azure, mas esta oferta é por tempo limitado) é possível trabalhar em modo off-line em desenvolvimento e testar localmente.

Abrindo o Visual Studio (em modo administrador), criando um novo projeto você verá a opção WINDOWS AZURE PROJECT, de o nome do projeto e aperte o OK para criá-lo. Uma tela irá se abrir (Figura 4) selecione Web Role e clique em OK.

Figura 4. Criando um Web Role

3. Criando, Listando e Deletando Containers

Para começar e para deixar nosso código mais enxuto vamos criar uma classe que será responsável por informar para nossa aplicação qual a URL da conta de armazenamento e as credenciais de acesso. Está credencial trata-se de uma chave string ou array de bytes fornecida pelo site do Windows Azure.  Conforme a Listagem 1, veja que é um código bem simples e que você pode armazenar estes dados no arquivo de configuração ou aonde você achar mais adequado.

using Microsoft.WindowsAzure;

using System.Configuration;

namespace MyFirstAzure

{

    public class StorageControle

    {

        internal static string BlobURL

        {

            get { return "http://olavoazure.blob.core.windows.net"; }

        }

        private static StorageCredentials credenciais = null;

        internal static StorageCredentials Credenciais

        {

            get

            {

                if (credenciais == null)

                {

                    credenciais = new StorageCredentialsAccountAndKey("olavoazure", "ChaveDeAcesso");

                }

                return credenciais;

            }

        }

    }

}

Listagem 1. Gerenciando credenciais

Caso você queria trabalhar em modo off-line, segue na Listagem 2 como você deve recuperar as informações de url e credenciais de acesso ao storage local utilizando a classe CloudStorageAccount.

using Microsoft.WindowsAzure;

using System.Configuration;

namespace MyFirstAzure

{

    public class StorageControle

    {

        internal static string BlobURL

        {

            get { return CloudStorageAccount.DevelopmentStorageAccount.BlobEndpoint.AbsoluteUri; }

        }

         internal static string TableURL

        {

            get { return CloudStorageAccount.DevelopmentStorageAccount.TableEndpoint.AbsoluteUri; }

        }

        internal static string QueueURL

        {

            get { return CloudStorageAccount.DevelopmentStorageAccount.QueueEndpoint.AbsoluteUri; }

        }

        private static StorageCredentials credenciais = null;

        internal static StorageCredentials Credenciais

        {

            get

            {

                if (credenciais == null)

                {

                    credenciais = CloudStorageAccount.DevelopmentStorageAccount.Credentials;

                }

                return credenciais;

            }

        }  

    }

}


Listagem 2. Credenciais em modo de desenvolvimento local

Inicialmente, todas as classes da Storage API do Windows Azure estão no namespace Microsoft.WindowsAzure.StorageClient então se lembre de sempre adicionar esta referencia as suas classes.

A classe responsável por gerenciar os containers é a CloudBlobClient, por ela podemos criar containers, listar os existentes, gerenciar metadatas e apagá-los. A instanciação da classe exige que seja passado o endereço da conta Blob no storage e as credenciais de acesso.

Depois de instanciado, temos de pegar a referencia ao container (mesmo que ele não exista ainda) para isto utilizamos o método GetContainerReference passando como parâmetro o nome do container. Este método retorna um tipo CloudBlobContainer responsável por gerenciar os Blobs internos a ele. O método CreateIfNotExists() cria o container verificando se ele já existe, caso já exista nada será feito. 

Atenção: O nome do container não deve conter letras másculas nem espaço entre as palavras.

As permissões também serão criadas agora, para isto devemos utilizar a classe BlobContainerPermissions setando a propriedade PublicAccess para Container (queremos com isto que todos consigam baixar o que está dentro dos contêineres) e passadas ao container através do método SetPermissions. Segue na Listagem 3 o método completo de criação de containers.

public void criarContainer(string nome)
{
    CloudBlobClient blobClient = new CloudBlobClient(StorageControle.BlobURL, StorageControle.Credenciais);
    //Sempre letras minusculas
    CloudBlobContainer blobContainer = blobClient.GetContainerReference(nome.ToLower().Replace(" ",""));
    blobContainer.CreateIfNotExist();
    //Permissões
    BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
    containerPermissions.PublicAccess = BlobContainerPublicAccessType.Container;
    blobContainer.SetPermissions(containerPermissions);
}

Listagem 3. Código para criar um container

Para listar os containers já criados, conforme já foi dito, utilizamos a classe CloudBlobClient chamando o método ListContainers() aqui podemos passar como parâmetro o prefixo do nome do container. Veja exemplo na Listagem 4

public List<CloudBlobContainer> listaContainers()

{

    CloudBlobClient blobCLient = new CloudBlobClient(StorageControle.BlobURL, StorageControle.Credenciais);

   return blobCLient.ListContainers().ToList();

}

Listagem 4. Listando containers

 A deleção de um container é feita diretamente do objeto CloudBlobContainer, a sua instanciação pode ser feita através do GetContainerReference() da classe CloudBlobClient() ou informando ao construtor da classe o endereço do container e as credenciais de acesso. Este endereço é a junção da url Blob storage com o nome do container, por exemplo: http://olavoazure.blob.core.windows.net/imagens.  O método responsável pela deleção do container é o Delete(). Segue exemplo na Listagem 5.

public void deletaContainer(string containerPath)

{

   CloudBlobContainer blobContainer = new CloudBlobContainer(containerPath, StorageControle.Credenciais);

   blobContainer.Delete();

}

Listagem 5. Deletando containers

4. Upload de Arquivos, Criando Blobs

Como já foi dito, um Blob representa um arquivo que será adicionado a um container e poderá conter metadados. A classe responsável por gerenciar o Blob, realizando o upload do arquivo e armazenado as tags, é a CloudBlob. O upload do arquivo poderá ser feito através do endereço do arquivo, de um array de bytes, por uma stream ou ,no caso de textos, através de uma string.

A criação do Blob é feita através da classe CloudBlobClient,  utilizando o método GetBlobReference() e passando como parâmetro o nome do Blob ou sua URL. A definição dos metadados é feito na propriedade Attributes.Metadata é obrigatório que este passo seja feito DEPOIS do upload do arquivo. Logo depois de definido os metadados, é necessários salva-los, isto é feito através do método SetMetadada().

A classe CloudBlob contém algumas propriedades referentes aos dados do arquivo como tamanho, tipo e data de gravação. A maioria destas propriedades é somente leitura mas ContentType deverá ser informada. Como no item acima, existe um método chamado SetProperties() para salvar as propriedades modificadas logo após o upload do arquivo.

Segue o método implementado na Listagem 6, note que temos dois parâmetros na assinatura do método,  o primeiro é do tipo HttpPostedFile tipo retornado pelo Controle FileUpload na propriedade PostedFile. O segundo parâmetro é o endereço completo do container.

public void adicionarArquivo(System.Web.HttpPostedFile arquivo, string container)

{

   CloudBlobContainer blobContainer = new CloudBlobContainer(container, StorageControle.Credenciais);

   blobContainer.CreateIfNotExist();

  //Cria o BLOB

  CloudBlob myBlob = blobContainer.GetBlobReference(arquivo.FileName);

  myBlob.UploadFromStream(arquivo.InputStream);

  //MetaData

  myBlob.Attributes.Metadata.Add("FileName", arquivo.FileName);

  myBlob.Attributes.Metadata.Add("FileExtension", arquivo.ContentType);

  myBlob.SetMetadata();

  //Propriedades

  myBlob.Properties.ContentType = arquivo.ContentType;

  myBlob.SetProperties();

}

Listagem 6. Criando o Blob e fazendo o upload do arquivo

5. Listando e Deletando Blobs

A Listagem dos Blobs parte da classe do container (CloudBlobContainer) através do método ListBlobs que como o nome diz, ele retorna uma lista de Blobs. Para o método de exemplo da Listagem 7, criamos um DataTable somente para exemplificar como se faz para retornar os dados internos do Blob. Um detalhe importante é que para recuperar as propriedades internas do Blobs, antes é necessário utilizar o método FetchAttributes().


public System.Data.DataTable listarBlobs(string containerPath)

{

    //Tabela para retorno dos campos do Blob

    System.Data.DataTable dtBlobs = new System.Data.DataTable("Blobs");

    dtBlobs.Columns.Add("Nome");

    dtBlobs.Columns.Add("Tipo");

    dtBlobs.Columns.Add("Url");

    CloudBlobContainer blobContainer = new CloudBlobContainer(containerPath);

    //Lista Blobs existentes no container

    foreach (CloudBlob blob in blobContainer.ListBlobs())

    {

        blob.FetchAttributes();//Comando para recuperar os atributos do Blob

        dtBlobs.Rows.Add(new object[]{

        blob.Metadata["FileName"].ToString(),//Nome do Arquivo

        blob.Properties.ContentType,//Tipo

        blob.Uri.AbsoluteUri//Url

        });

    }

    return dtBlobs;

 }

Listagem 7. Listando os Blobs

Para finalizar, vamos deletar um Blob, a deleção é feita diretamente na classe CloudBlob chamado o método DeleteIfExists(). A Instanciação do Blob pode ser feita diretamente passando como parâmetros a URL do Blob e as credenciais de segurança. Segue exemplo na Listagem 8:


public void deleta(string blobPath)

{

     CloudBlob blob = new CloudBlob(blobPath, StorageControle.Credenciais);

     blob.DeleteIfExists();

}

Listagem 8. Deletando o Blob

Por enquanto é isto, espero ter demonstrado um pouco da API do Windows Azure. Depois de muito esperar e tentar eu finalmente consegui uma conta gratuita do Azure, pena que ela só estará disponível até o dia 16/03/2011 mas  até lá estou tentando implementar algo diariamente para brincar e aprender. A url do meu site é http://8667ebce1752445bb9ddaf86ff7e4b68.cloudapp.net/ Para postar Blobs tem de botar senha(devido à limitação do espaço) mas o resto está livre para quem quiser brincar também.

Anúncios
Esse post foi publicado em Windows Azure. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s