onsdag 23 april 2008

Använda Amazon S3 för filuppladdning i Ruby on Rails

Varning: inlägget är endast riktat mot folk som tycker att Ruby on Rails är åtminstone en gnutta intressant. Har du inte programmerat förut kommer du antagligen inte att koppla särskilt mycket av det här.

Häpp! Jag har lekt lite och gjort min första plugin för Ruby on Rails. Den gör det enkelt att ladda upp filer och lagra dem hos Amazon S3. Fördelen med att lagra filer där är att lagringsutrymmet hos Amazon S3 är billigt och de har kapacitet att visa dina filer miljontals gånger. Du betalar dessutom enbart för utrymmet du använder. Många använder det som backup för att lagra viktiga saker om deras egen hårddisk skulle gå sönder.

Så låt oss skapa en enkel applikation där du lagra dina hemliga filer. Jag förutsätter nu att du har installerat Ruby on Rails, minst version 2.0.2.

Börja med att installera Amazons rubygem för att hantera s3-resurser
sudo gem install aws-s3

Sedan skapar vi vår applikation:
rails backup

Nästa steg är att ladda hem min fina plugin. Det gör du på github.com/standout/s3storage/tarball/master. Packa upp filen och placera den i backup/vendor/plugins/s3storage/. Om du kör senaste versionen av rails kan du installera den direkt med script/plugin install git://github.com/standout/s3storage.git

Vi ska dessutom skapa vår modell för filer som ska backas upp. Vi kallar den för Document
script/generate scaffold Document title:string content_type:string original_filename:string

Migrera databasen:
rake db:migrate

Nu kör vi igång vår applikation med
script/server

Tag bort filen public/index.html och öppna filen config/routes.rb och ändra rad 30 till map.root :controller => "documents"


Nu går vi till views/documents/new.html.erb och ändrar enligt följande:

Det viktiga är :html => { :multipart => true } som gör att webbläsaren förstår att det handlar om filuppladdning, samt <%= f.file_field :file %< där 'file' är det magiska ordet som gör att vår plugin förstår att filen ska sparas hos Amazon S3.

Nästa steg är att fixa till listningen av filer. Det gör vi i app/views/documents/index.html.erb
Vi ändrar helt enkelt på rad 14 till <td><%= link_to h(document.original_filename), s3_path %></td> för att skapa en länk till vårt uppladdade dokument. s3_path är adressen till filen på Amazon S3.



Till sist gör vi det viktigaste av allt, bestämmer var filerna ska lagras. Vi öppnar vår modell (app/models/document.rb) och lägger till följande;


Givetvis får du byta ut allt som börjar med YOUR_ ... mot dina egna inloggningsuppgifter hos Amazon S3. Bucket-namnet bestämmer du själv, men tänk på att det ska vara helt unikt, precis som ett domännamn. Jag brukar förresten välja domännamn som bucketnames just för att de är unika. Du behöver inte skapa din bucket från början, det gör scriptet åt dig om du bara säger vad den ska heta.

Access_key och Secret får du direkt från aws.amazon.com. Klicka på Access Identifiers under den gula knappen "Web Services Account" till höger.



Nu kan vi titta på http://127.0.0.1:3000/ och se hur fint vår applikation fungerar.



Funkar det för dig också?

3 kommentarer:

  1. Funkar ju hur bra som helst! Nice work :)

    SvaraRadera
  2. Enkelt att installera. Me like. Jag undrar mest om det här med Github. Är det så bra som folk säger?

    SvaraRadera
  3. Klockrent! Stort tack för detta. :-D

    SvaraRadera