quarta-feira, 10 de dezembro de 2014

Upload arquivos usando o AWS SDK for .NET (C#)

É bastante comum em diferentes tipos de projetos a necessidade de fazer upload de algum tipo de arquivo, sendo ele uma imagem ou algum outro. A forma mais fácil ou a mais utilizada seria fazer upload desse arquivo para uma determinada pasta do projeto, e se você estiver utilizando o IIS como servidor de pagina ou mesmo se for APACHE por exemplo de ambas as formas você estaria fazendo teu servidor entregar o conteúdo estático que nesse caso seria o arquivo que foi feito upload. Não vejo nenhum problema nisso quando falamos de poucos arquivos mas se a sua aplicação tiver uma necessidade maior de performance na entrega ou até mesmo a quantidade for bastante grande gerando um tamanho significante no disco do teu servidor você teria que optar por outra coisa.
Para isso a AMAZON AWS oferece um serviço bastante barato e rápido que pode ser utilizado para diversas outras funcionalidades. Apresentação do serviço no site oficial: http://aws.amazon.com/pt/s3/
A intenção desse post é exatamente mostrar como é simples a integração com o serviço "Simple Storage Service" ou como é conhecido AMAZON S3.

Primeiramente eu criei uma classe estática e nela vamos codificar o nosso método de uploadFile. A organização de onde ficaria melhor a classe fica a critério da arquitetura que você está trabalhando.
Antes de começar a codificar vamos fazer referencia ao SDK da amazon aws, você pode encontrar ele facilmente no Nuget.https://www.nuget.org/packages/AWSSDK/2.3.12 ou se você prefere por command.


   public static class UploadAmazon  
   {  
     private static IAmazonS3 client;  
     public static HttpStatusCode UploadFile(Stream file, string type, string nomeImagem)  
     {  
       using (client = AWSClientFactory.CreateAmazonS3Client("****key****", "***secret key****"))  
       {  
         PutObjectRequest request = new PutObjectRequest();  
         request.BucketName = "MeusArquivos";      //nome do bucket name  
         request.CannedACL = S3CannedACL.PublicRead;  //permissões  
         request.Key = "Arquivos/" + nomeImagem;    //diretorio e nome do arquivo  
         request.ContentType = type;         //type do arquivo  
         request.InputStream = file;         //Stream do arquivo  
         return client.PutObject(request).HttpStatusCode;  
       }  
     }  
   }  
Veja que o código é bastante simples =)
Apenas se atentar alguns detalhes, a propriedade "BucketName" eu coloquei fixa porém você poderia fazer uma verificação se esse "BucketName" se ele já não existe na sua storage, ficaria mais ou menos assim:
 private static bool IsCheckBucket(string bucketName)  
 {  
     ListBucketsResponse response = client.ListBuckets();  
     bool found = false;  
     foreach (S3Bucket bucket in response.Buckets)  
     {  
         if (bucket.BucketName == bucketName)  
         {  
           found = true;  
           break;  
         }  
      }  
      return found;  
  }  
(...) e para criar o BucketName
   public void CreateBucket(string bucketName)  
     {  
       if (!this.IsCheckBucket(bucketName))  
       {  
         client.PutBucket(new PutBucketRequest()  
         {  
           BucketName = bucketName,  
           UseClientRegion = true //Utiliza a mesma região que estiver como padrão no WS.  
         });  
       }  
     }  

Outra propriedade importante também seria "CannedACL" que indica o tipo de permissão que o arquivo terá no storage da amazon aws, nesse caso eu coloquei como "S3CannedACL.PublicRead" que esse arquivo poderá ser visto publicamente.
Para concluirmos você deve ter reparado que ao fazer a chamada da classe "AWSClientFactory" você precisa passar a ela a sua chave e também a chave secreta. Essas duas chaves você pode gerar através do painel de controle da Amazon AWS.
Ao acessar o console https://aws.amazon.com/ com o teu login, você vai ver no menu acima na aba escrita com seu nome a opção "Security Credencials".

Acesse:

Agora é só gerar a sua key e secret key e inserir na chamada.
Se obtiver sucesso no upload você pode acessar o console na opção de serviço S3, você vai perceber que o seu "BucketName" e dentro dele o arquivo enviado, ao clicar sobre o arquivo perceba nas propriedade que Amazon AWS gerou uma url publica de acesso ao seu arquivo que será algo parecido com isso: https://s3.amazonaws.com/MeusArquivos/Arquivos/nome_arquivo
Agora é só usufruir da performance que a storage vai te oferecer além disso com um valor muito pequeno.

Espero ter ajudado.
Abraço,

Nenhum comentário:

Postar um comentário