jeudi 25 juin 2015

Upload image from URL with Paperclip to AWS S3

I have a list of products. For each product, I have one image_url that I want to upload to my AWS S3 account and associate to it.

I am able to do it manually via the form, but with ~1500 products, I can't do it one by one.

My Paperclip config looks like this :

config.paperclip_defaults = {
    :url => 'xxxx',
    :path => '/:class/:attachment/:id_partition/:style/:filename',
    :command_path => "/usr/bin/convert",
    :storage => :s3,
    :s3_credentials => {
      :bucket => "xxx",
      :access_key_id => "XXX",
      :secret_access_key => "XXXX"
    }
  }


Here is the code I use to upload manually my image

class Product < ActiveRecord::Base
  # This method associates the attribute ":image" with a file attachment
  has_attached_file :image, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>'
  }

  # Validate the attached image is image/jpg, image/png, etc
  validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

end

Everything goes well, I can see at the end of the log :

[paperclip] saving /products/images/000/001/361/original/xxx.jpg
[AWS S3 200 1.107584 0 retries] put_object(:acl=>:public_read,:bucket_name=>"xxx",:content_length=>47766,:content_type=>"image/jpeg",:data=>Paperclip::UploadedFileAdapter: xxx.jpg,:key=>"products/images/000/001/361/original/xxx.jpg")  

[paperclip] saving /products/images/000/001/361/thumb/xxx.jpg
[AWS S3 200 0.444224 0 retries] put_object(:acl=>:public_read,:bucket_name=>"xxx",:content_length=>26502,:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter: 3ef480ec0ebbef3921b4c074897fecc320150625-13674-roduas,:key=>"products/images/000/001/361/thumb/xxx.jpg")  

[paperclip] saving /products/images/000/001/361/square/xxx.jpg
[AWS S3 200 0.492781 0 retries] put_object(:acl=>:public_read,:bucket_name=>"xxx",:content_length=>36071,:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter: 3ef480ec0ebbef3921b4c074897fecc320150625-13674-1xrcndz,:key=>"products/images/000/001/361/square/xxx.jpg")  

[paperclip] saving /products/images/000/001/361/medium/xxx.jpg
[AWS S3 200 0.553079 0 retries] put_object(:acl=>:public_read,:bucket_name=>"xxx",:content_length=>43927,:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter: 3ef480ec0ebbef3921b4c074897fecc320150625-13674-8dq1h4,:key=>"products/images/000/001/361/medium/xxx.jpg")



But now I want to automate this task (when seeding the database). I added open-uri to retrieve image from their URL.

require 'open-uri'

class Product < ActiveRecord::Base
  # This method associates the attribute ":image" with a file attachment
  has_attached_file :image, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>'
  }

  # Validate the attached image is image/jpg, image/png, etc
  validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

  def image_from_url(url)
    self.image = URI.escape(url)
  end

end

What I basically do is to create a new Product with something like :

Product.create! :name => "Test!!!"

Then try to add image to it :

Product.last.image_from_url "MY_URL"

I have no error with that but it does not work. I can see on the log the conversion for each format (thumb, square, medium) but it is not push to AWS like before.




Aucun commentaire:

Enregistrer un commentaire