Risposte:
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://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Tuttavia, probabilmente va bene nella maggior parte delle situazioni.
open(url)
, il nome del file non è accurato, ad esempio open-uri20150106-10034-lpd5fm.
invece di ef3a601e_ef3d008b_ef3d0f7e.jpg
.
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 del file. Con quanto sopra otterrai un nome corretto 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"
application/octet_stream
come content_type
.
Non ha funzionato per me fino a quando non ho usato "open" per l'URI analizzato. una volta aggiunto "open" ha funzionato!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
La mia versione della graffetta è 4.2.1
Prima di aprirlo non rilevava il tipo di contenuto corretto, perché non era un file. Direbbe image_content_type: "binary / octet-stream", e anche se lo sovrascrivessi con il giusto tipo di contenuto non funzionerebbe.
Prima scarica l'immagine con la curb
gemma su a, TempFile
quindi assegna semplicemente l'oggetto tempfile e salva il tuo modello.
Potrebbe esserti utile. Ecco il codice utilizzando graffetta e 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, eccone uno più nuovo:
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 consenti ad altri di caricare un'immagine da un URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
?
super
viene utilizzata per richiamare il metodo originale, la ricerca del corpo del metodo inizia nella super classe dell'oggetto che è stato trovato per contenere il metodo originale
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.
Nella documentazione ufficiale è riportato qui https://github.com/ Thoughtbot/ paperclip/ wiki/ Attachment- downloaded- from-a-URL
Comunque sembra non aggiornato, perché nell'ultima versione di paperclip qualcosa è cambiato e questa riga di codice non è più valida:
user.picture = URI.parse(url)
Solleva un errore, in particolare viene sollevato questo errore:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
La nuova sintassi corretta è questa:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Inoltre dobbiamo aggiungere queste righe nel file config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Testato con la versione a graffetta 5.3.0
e funziona.
update_attributes
rinominapicture_from_url
in,picture_url=(value)
ad esempio.