Archive for the ‘Paperclip’ Category

Uploading Files to Amazon S3 with Paperclip

Paperclip is a very basic and useful ruby gem which is used in almost every rails application. Basically it allows user to upload images and other attachments for storage and processing. Storing Files/Attachments to Amazon S3 with paperclip is rather a simple job but i will still give a dig on out just if it comes out useful to anyone. There are two parts to the uploading. First Storge, Second Retrieval. We will take them one by one: Storage:
    • Apart from uploading files to your application server, paperclip also allows you to store your files on some external storage services such as Amazon S3 so as to provide your application better scalability, reliability, and speed than just storing files on the filesystem.
    • To upload your files to amazon s3 using paperclip, We can go through the following steps(assuming that you are already using paperclip to store files to your filesystem):-
    • Add the following gems to your Gemfile (This is the gem for including the Amazon SDK support):-
       gem 'aws-s3', :require => 'aws/s3'
       gem 'aws-sdk'
    • Run the ‘bundle install’ command.
    • Lets configure the model for paperclip :-
       class Post < ActiveRecord::Base
       attr_accessible :avatar
       has_attached_file :avatar,
       :styles => { :medium => "300x300>"},
       :storage => :s3,
       :s3_credentials=>{:access_key_id=>"AWS_ACCESS_KEY_ID",
       :secret_access_key => "AWS_SECRET_ACCESS_KEY"},
       :s3_permissions => "public-read",
       :path => ":id",
       :bucket => "AWS_BUCKET"
       end
    • Lets deciper the parameters above :
    1. s3_credentials : Takes a path, a File, or a Hash containing the access_key_id and secret_access_key that Amazon gives you.
    2. s3_permissions: This is a String that should be one of the access policies that S3 provides. The default for Paperclip is :public_read.
    3. bucket: This is the name of the S3 bucket that will store your files. Remember that the bucket must be unique across all of Amazon S3. If the bucket does not exist Paperclip will attempt to create it.
    4. path: This is the key under the bucket in which the file will be stored. The URL will be constructed from the bucket and the path. This is what you will want to interpolate. Keys should be unique, like filenames.
Retrieval Now, the Files that have been uploaded with Paperclip are stored in S3. However, metadata such as the file’s name, location on S3, and last updated timestamp are all stored in the model’s table in the database. Paperclip provides convenience methods to access the stored objects. e.g. To access the file’s url through the url method on the model’s file attribute (avatar in this example), you can use post.avatar.url (http://bucket.s3.amazonaws.com/…) Hope the blog comes in handy for someone looking to integrate paperclip with Amazon S3 pretty quickly.