Upload pro S3: o mais simples possível em Java

amazon_s3
Recentemente estive no QConSP 2013, onde encontrei muitos amigos e conversei bastante. Conversando com o Milfont, ele me falou que achava que ninguém mais faz upload de arquivos para um file system local, pois o S3 é muito conveniente e fácil de usar. Nos projetos Ruby dele ele usa o Paperclip, que permite o upload pro S3 com simples configurações.

Porém, nos nossos projetos Amazon vemos que a grande maioria das aplicações ainda não faz os uploads para o S3, e isto me motivou a escrever posts mostrando da forma mais simples possível o upload pro S3 em algumas linguagens, frameworks e produtos. Este post é o primeiro da série e nele vamos mostrar o upload convencional para o file system e o upload equivalente para o S3. Para a versão TL;DR, simplesmente faça o clone do github e experimente localmente.

No diretório WebContent há 2 htmls bem simples, ambos com formulários contendo um único elemento, de upload de arquivo. O arquivo disco.html aponta para o Servlet /UploadDisco, que manipula o stream de entrada da forma convencional (com o commons-fileupload) e salva em disco, conforme a seguir.

Para usar a versão com o S3, precisamos baixar o SDK para Java e adicionar às nossas dependências, ou usar o Maven para isso. As funcionalidades do S3 dependem de algumas bibliotecas do Apache Commons.

Além do SDK no classpath, precisamos adicionar um arquivo AwsCredentials.properties, com sua accessKey e secretKey. Ambas podem ser obtidas na opção Security Credentials, na console da Amazon, conforme a seguir.
aws_security_credentials.

A última coisa é que precisamos ter um bucket S3 disponível para o upload. Podemos criar um novo bucket pela API também, mas a opção mais fácil e mais comum é usar um bucket pré-existente.

Colocamos abaixo o Servlet recebendo o upload do arquivo e enviando diretamente a stream para o S3, sem manipular arquivos no file system local.

Neste upload, enviamos o arquivo para um bucket chamado rivendel-upload-s3, e definimos a sua política de acesso como público para leitura. Assim, qualquer pessoa poderá baixar o arquivo do S3 sem precisar de autenticação. Com o nome da região e o nome do bucket é possível montar a URL de acesso ao arquivo, que é sempre no formato: https://s3-nome-regiao.amazonaws.com/nome-bucket/nome-arquivo.

Em breve publicaremos os posts equivalentes em várias outras linguagens. Espero que seja útil para muitas pessoas :). Até a próxima!

21