Salva immagine dall’URL con paperclip

Per favore suggeriscimi un modo per salvare un’immagine da un URL di Paperclip.

Ecco un modo semplice:

require "open-uri" class User < ActiveRecord::Base has_attached_file :picture def picture_from_url(url) self.picture = open(url) end end 

Quindi semplicemente:

 user.picture_from_url "http://sofit.miximages.com/paperclip/ps_logo2.png" 

In Paperclip 3.1.4 è diventato ancora più semplice.

 def picture_from_url(url) self.picture = URI.parse(url) end 

Questo è leggermente migliore di open (url). Perché con open (url) otterrai “stringio.txt” come nome file. Con quanto sopra avrai un nome proprio del file basato sull’URL. vale a dire

 self.picture = URI.parse("http://something.com/blah/avatar.png") self.picture_file_name # => "avatar.png" self.picture_content_type # => "image/png" 

Per prima cosa scarica l’immagine con la gem del curb su un TempFile e poi assegna semplicemente l’object tempfile e salva il tuo modello.

Non ha funzionato per me finché non ho usato “open” per URI analizzato. una volta ho aggiunto “aperto” ha funzionato!

 def picture_from_url(url) self.picture = URI.parse(url).open end 

La mia versione di paperclip è 4.2.1

Prima di aprire non avrebbe rilevato il tipo di contenuto giusto, perché non era un file. Direbbe image_content_type: “binary / octet-stream”, e anche se lo sovrascrivo con il giusto tipo di contenuto non funzionerebbe.

Potrebbe esserti utile. Ecco il codice che utilizza paperclip e l’immagine presente nell’URL remoto.

 require 'rubygems' require 'open-uri' require 'paperclip' model.update_attribute(:photo,open(website_vehicle.image_url)) 

Nel modello

 class Model < ActiveRecord::Base has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" } end 

Poiché quelli sono vecchi, Answer è qui uno più recente:

Aggiungi l’URL remoto dell’immagine al controller desiderato nel database

 $ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string $ rake db:migrate 

Modifica il tuo modello

 attr_accessible :description, :image, :image_remote_url . . . def image_remote_url=(url_value) self.image = URI.parse(url_value) unless url_value.blank? super end 

* In Rails4 devi aggiungere attr_accessible nel Controller.

Aggiorna il modulo, se autorizzi altri a caricare un’immagine da un URL

 <%= f.input :image_remote_url, label: "Enter a URL" %> 

Questo è un metodo hardcore:

 original_url = url.gsub(/\?.*$/, '') filename = original_url.gsub(/^.*\//, '') extension = File.extname(filename) temp_images = Magick::Image.from_blob open(url).read temp_images[0].write(url = "/tmp/#{Uuid.uuid}#{extension}") self.file = File.open(url) 

dove Uuid.uuid crea solo un ID casuale.