Upload files in Amazon S3 with Paperclip and Rails 4

Upload files in Amazon S3 with Paperclip and Rails 4

Here is a clean approach to set the configuration of model to upload images in Amazon S3 server with paperclip in Ruby on Rails. We need following gems in out Gemfile

gem 'paperclip'
gem 'aws-sdk'

In the config folder create a file called config/api_config.yml where you set up your bucket name, amazon access key and access secret in the file.

development:
  amazon_bucket_name: demo-dev
  amazon_access_key: XXXXXXXXXXXXXXXXXXXX
  amazon_access_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

production:
  amazon_bucket_name: demo-prod
  amazon_access_key: XXXXXXXXXXXXXXXXXXXX
  amazon_access_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Our next step is to create a file called config/paperclip_options.yml, which will contain configurations of paperclip like styles, url, convert_options, etc

common: &default_settings
  :access_key_id: <%= API_CONFIG['amazon_access_key'] %>
  :secret_access_key: <%= API_CONFIG['amazon_access_secret'] %>
  :bucket: <%= API_CONFIG['amazon_bucket_name'] %>

production: &production
  :users:
    :avatar:
      :storage: !ruby/symbol s3
      :s3_protocol: :http
      :s3_credentials:
        <<: *default_settings
      :s3_permissions:
        :avatar: :public_read
      :default_url: '/assets/missing.png'
      :styles:
        :mini: '48x48>'
      :url: ":s3_domain_url"
      :path: 'images/:id/:style/:basename.:extension'
      :convert_options:
        :all: '-strip -auto-orient -colorspace sRGB'

development:
  <<: *production

This file will set s3_credentials to the credential in api_config.yml and will set up other asset details. Now create a file named config/initializers/paperclip_config.rb which will map the configuration of above two file and set those in the environment variables of the Ruby on Rails app.

API_CONFIG = YAML.load_file("#{Rails.root}/config/api_config.yml")[Rails.env]

class DemoApp::Configuration
  class << self
    attr_accessor :paperclip_options
  end
end

DemoApp::Configuration.paperclip_options = YAML.load(ERB.new(File.read(Rails.root.join('config', 'paperclip_options.yml'))).result)[Rails.env]
Paperclip::Attachment.default_options[:use_timestamp] = false

In our user model, we just need to add the mapping of the image file, we can simply do it with DemoApp::Configuration.paperclip_options[:users][:image] which we have configured in paperclip_config.rb file.

class User < ActiveRecord::Base

  has_attached_file :image,
    DemoApp::Configuration.paperclip_options[:users][:avatar]

end

You can create view of your choice to upload the image. Just make sure image key in the params should have a image. You can have a look at Upload image without submitting form, works on all browsers to get an idea for the controller and view code.

Ishank Gupta

Related articles

Our two bytes give the latest technology trends and information that gives you fair information about the subject.

Important Things to Consider Before Migrating to Shopify

Important Things to Consider Before Migrating to Shopify

Change is important with time and this applies to technology as well. All those who feel that their eCommerce platform is not performing well and r...
A Comprehensive Guide To Create An Ecommerce App From Scratch

A Comprehensive Guide To Create An Ecommerce App From Scratch

With the rising technology it has been noticed that development of an eCommerce app for eCommerce stores/businesses is an effective way of boosting...
Headless Commerce with Shopify: A Comprehensive Guide

Headless Commerce with Shopify: A Comprehensive Guide

To see a positive growth of your business store you must look for an ideal eCommerce platform. With the changing market trends, it has been noticed...

Cookie Preferences

We use cookies to deliver the best possible experience on our website. To learn more, visit our Privacy Policy. Please accept the cookies for optimal performance.Cookie Notice.