Apresentação do editor: O AC é nosso conhecido de longa data, já tendo participado de alguns projetos conosco e fazendo parte da nossa rede mais próxima de profissionais.
Ele tem uma bagagem enorme com desenvolvimento Ruby e Java e publica bastante coisa interessante também no seu blog http://www.beyondclick.com.br. Bom, vamos ao post! 🙂
Seguindo a série de artigos que visam mostrar a forma mais simples de subir um arquivo para a Amazon S3 em diferentes linguagens e tecnologias (confira na seção saiba mais). Neste artigo vou mostrar como fazer usando Ruby. Ruby, não Rails. Esse é o próximo artigo. 😉
Para a versão TL;DR, fork no github.
A forma mais simples, presupõe que teremos a menor quantidade de dependências no projeto. Por conta disso achei justo fazer uma aplicação Rack
Neste caso teremos duas dependências, que não estão no Ruby:
Como eu tenho carinho com meus projetos, eu declarei as dependências em um Gemfile e, uso o Bundler para colocar as gems no “classpath” da aplicação Rack.
A AWS-SDK em ruby é uma gem, criada pela Amazon, para acessar os seus serviços de forma simplificada.
A documentação do aws-sdk descreve todos os módulos disponíveis.
Neste artigo irei utilizar o modulo AWS::S3, que é o client para o serviço Amazon S3.
A página com o formulário, não tem nada de mais. Ela é simples, o suficiente, para ser apenas um arquivo html.
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="arquivo_para_upload" /> <input type="submit" value="Enviar"/> </form>
O campo file, deste formulário, quando enviado, irá gerar o seguinte parâmetro:
{ "arquivo_para_upload" => { :filename => "earth.jpg", :type => "image/jpeg", :name => "file", :tempfile => #, :head => "Content-Disposition: form-data; name=\"file\"; filename=\"earth.jpg\"\r\nContent-Type: image/jpeg\r\n" } }
Basicamente, o Rack se encarrega de criar um arquivo temporário e te dá uma forma trivial de recuperar o arquivo. Basta acessar o valor, pela Hash:
request.params["arquivo_para_upload"][:tempfile]
Para mandar o arquivo enviado para a Amazon S3, usamos o arquivo temporário, criado pelo Rack ao receber a requisição POST com o form multi-part. Mas, antes temos que fazer o login e recuperar um bucket:
filename = request.params["arquivo_para_upload"][:filename] filepath = request.params["arquivo_para_upload"][:tempfile] s3 = AWS::S3.new( :access_key_id => your_access_key_id, :secret_access_key => your_secret_access_key) bucket = s3.buckets[your_bucket_name] object = @bucket.objects["#{Time.now}-#{filename}"] # Do not replace existing files. object.write(Pathname.new(filepath))
Pronto! Arquivo na Amazon! \o/
Para facilitar a compreensão do código, separei em arquivos com responsabilidades distintas:
Gostou do conteúdo? Tem alguma dúvida? Entre em contato com nossos Especialistas Mandic Cloud, ficamos felizes em ajudá-lo.