Caro(a) Leitor(a), hoje eu vou mostrar na prática como fazer upload de uma imagem para o serviço do Amazon chamado S3, verificando o tamanho da imagem, largura e altura. É importante analisar o tamanho da imagem para que o usuário não envie imagens enormes.


Utilizado:

Ferramenta Visual Studio 2013

Linguagem de programação C#

Tecnologia ASP.NET

Serviço Amazon S3 (Scalable Store in the Cloud)


Falando um pouco do serviço da Amazon, até o momento está tudo funcionando de forma perfeita. Se você quiser aderir o serviço basta acessar o site aws.amazom.com, no primeiro ano é grátis pra você, na verdade o serviço começa a cobrar alguns centavos de dólar no seu cartão de crédito. Depois de um ano, o valor aumenta um pouco de acordo com a demanda de entrada de dados e saída. O valor é pequeno, tenha certeza disso.


Em resumo, não me arrependo de utilizar o serviço de armazenamento na nuvem. Existem outros serviços de armazenamento como o Azure da Microsoft, o problema é que, não tive oportunidade de testar ainda o serviço. Depois de testar, vou postar um artigo.


O código para fazer upload para qualquer servidor de hospedagem é simples. No site www.ecode10.com existem vários exemplos mostrando como envia imagens ou arquivos. Basta procurar por upload no site.


O que tem diferente então no código que irei mostrar? Bom, a grande diferença é que a página verifica o tamanho, largura e altura em poucas linhas de código. Para utilizar o serviço você precisa ter uma api / dll do Amazon referenciado no seu sistema / site. Essa api você encontra no site http://aws.amazon.com/sdkfornet/ e lá tem também uma pequena documentação.


Faça download da api e instale no seu computador. Não esqueça de referenciar a dll no seu código. Basta clicar com o botão direito do mouse em “References" e depois escolher a opção Add Reference… . Veja a imagem 1 abaixo: 





Imagem 1 - Adicionando referência.


Vamos passar para a parte da interface. Procurei fazer uma tela simples, pois no meu caso, preciso que o usuário envie só uma vez a imagem. Existe então um campo texto, um botão para o usuário escolher a imagem e outro botão para enviar. Veja a imagem 2.



Imagem 2 - Interface.


Quem faz todo o trabalho aqui é o botão “Enviar Imagem”. Então vou programar ele agora pra você entender como fazer. Cliquei duas vezes em cima do botão e um método foi gerado para a codificação. Veja a referência 1.


Referência 1 - Codificando o botão “Enviar Imagem”.


protected void cmdEnviarImagem_Click(object sender, EventArgs e)

        {

            try

            {

      //pega o tamanho da imagem enviada

                   int tamanho = flUploadImagem.PostedFile.ContentLength;


                    if (tamanho <= 4000000)

                    {

              //pega o nome da imagem.

                        string filename = System.IO.Path.GetFileName(flUploadImagem.PostedFile.FileName);

                        filename = Guid.NewGuid() + filename;


//informa código e senha

                        TransferUtility fileTransferUtility = new TransferUtility(“codigo", "senha");


//informa os parâmetros e pasta

                        var uploadRequest = new Amazon.S3.Transfer.TransferUtilityUploadRequest();

                        uploadRequest.InputStream = flUploadImagem.PostedFile.InputStream;

                        uploadRequest.BucketName = "Pasta";

                        uploadRequest.Key = filename;

                        uploadRequest.StorageClass = S3StorageClass.ReducedRedundancy;

                        uploadRequest.CannedACL = S3CannedACL.PublicRead;


//faz o upload.

                        fileTransferUtility.Upload(uploadRequest);


//pegando as informações da imagem para verificar largura e altura

                       string urlImagem = “url da imagem”;

                        HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(urlImagem);

                        HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();

                        Stream stream = httpWebReponse.GetResponseStream();


                        System.Drawing.Image objImage = System.Drawing.Image.FromStream(stream);

//com o objeto, você pega a largura e altura

                        int w = objImage.Width;

                        int h = objImage.Height;


                        if (w <= 500 && h <= 500)

                        {

//insere o valor no banco de dados.

                        }

                        else

                            // exibe mensagem informando que o tamanho da imagem é maior do que 500.

                    }

                    else

                    {

                        //A imagem deve ser menor do que 4.000.000 bytes.

                    }

                }

            }

            catch (Exception ex)

            {

                //erro ao enviar a imagem.

            }

        }   


Note que em cada bloco de linha existe o comentário falando o que aquele conjunto de código faz. A primeira linha pega o tamanho total da imagem. Depois eu pego o nome e armazeno na variável “filename”.


//pega o tamanho da imagem enviada

int tamanho = flUploadImagem.PostedFile.ContentLength;



Coloquei também o GUID antes do nome para que não haja imagem repetida.


filename = Guid.NewGuid() + filename;


Para usar o TransferUtility é necessário usar um código e senha que o próprio Amazon informa no site.


//informa código e senha

TransferUtility fileTransferUtility = new TransferUtility(“codigo", "senha");



Continuando no código, alguns parâmetros precisam ser informados antes de fazer upload.  É necessário informar a pasta, se a imagem pode reduzir a redundância e se ela é pública ou privada.


//faz o upload.

fileTransferUtility.Upload(uploadRequest);


Depois de upload, você pode pegar o local da imagem e verificar a largura e altura.


//pegando as informações da imagem para verificar largura e altura

string urlImagem = “url da imagem”;

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(urlImagem);

HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();

Stream stream = httpWebReponse.GetResponseStream();


System.Drawing.Image objImage = System.Drawing.Image.FromStream(stream);


//com o objeto, você pega a largura e altura

int w = objImage.Width;

int h = objImage.Height;


Dessa forma, o código ficou bem simples. 

Bom, eu fico por aqui e espero que tenha gostado de todo o código aqui. Qualquer dúvida, pode entrar em contato pelo site www.mauriciojunior.org.