Respuestas:
He aquí una forma sencilla:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Entonces simplemente:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Sin embargo, probablemente esté bien en la mayoría de las situaciones.
open(url)
, el nombre del archivo no es exacto, por ejemplo, en open-uri20150106-10034-lpd5fm.
lugar de ef3a601e_ef3d008b_ef3d0f7e.jpg
.
En Paperclip 3.1.4 se ha vuelto aún más sencillo.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Esto es un poco mejor que abierto (url). Porque con open (url) obtendrás "stringio.txt" como nombre de archivo. Con lo anterior, obtendrá un nombre adecuado del archivo según la URL. es decir
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
como content_type
.
No funcionó para mí hasta que usé "abierto" para el URI analizado. una vez que agregué "abrir" ¡funcionó!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
La versión de mi clip es 4.2.1
Antes de abrir, no detectaría el tipo de contenido correcto, porque no era un archivo. Diría image_content_type: "binary / octet-stream", e incluso si lo anulo con el tipo de contenido correcto, no funcionaría.
Primero descargue la imagen con la curb
gema a a TempFile
y luego simplemente asigne el objeto del archivo temporal y guarde su modelo.
Puede resultarle útil. Aquí está el código que usa un clip y una imagen presente en una URL remota.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
En modelo
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Como son respuestas antiguas, aquí hay una más nueva:
Agregue la URL remota de imagen a su controlador deseado en la base de datos
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Edita tu modelo
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
* En Rails4 debes agregar attr_accessible en el controlador.
Actualice su formulario, si permite que otros carguen una imagen desde una URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
de?
super
se usa para invocar el método original, la búsqueda del cuerpo del método comienza en la superclase del objeto que se encontró que contenía el método original
Este es un método duro:
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)
donde Uuid.uuid solo crea una identificación aleatoria.
En la documentación oficial se informa aquí https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
De todos modos parece no actualizado, porque en la última versión del clip algo ha cambiado y esta línea de código ya no es válida:
user.picture = URI.parse(url)
Genera un error, en particular se genera este error:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
La nueva sintaxis correcta es esta:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
También necesitamos agregar estas líneas en el archivo config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Probé esto con la versión de clip 5.3.0
y funciona.
update_attributes
cambiar el nombrepicture_from_url
a,picture_url=(value)
por ejemplo.