0

У меня есть список продуктов. Для каждого продукта у меня есть один image_url, который я хочу загрузить на свою учетную запись AWS S3 и связать с ней.Загрузить изображение из URL с помощью Paperclip в AWS S3

Я могу сделать это вручную через форму, но с ~ 1500 продуктами, я не могу сделать это один за другим.

Моего Paperclip конфигурация выглядит следующим образом:

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" 
    } 
    } 

Вот код, я использую, чтобы загрузить вручную моего изображение

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 

Все идет хорошо, я могу видеть в конце брокер:

[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") 


Но теперь я хочу автоматизировать эту задачу (при посеве базы данных). Я добавил open-uri для получения изображения с их 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 

То, что я в принципе сделать, это создать новый продукт с чем-то вроде:

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

Затем попробуйте добавить изображение к нему:

Product.last.image_from_url "MY_URL" 

У меня нет ошибки с этим, но это не работает. Я могу видеть в журнале преобразование для каждого формата (большой, квадратный, средний), но это не толкает AWS, как раньше.

ответ

1

Я нашел решение своего вопроса сразу после его написания. Возможно, это может помочь кому-то, поэтому я все равно разместил его.

Ошибка в том, что я не обновил изображение атрибута. Так что вместо того, чтобы делать:

Product.last.image_from_url "MY_URL" 

я сделал:

Product.last.update_attribute :image, Product.last.image_from_url("MY_URL") 

Теперь изображение генерируется И закачанный в AWS

Смежные вопросы