ruby on rails - notidentifiedbyimagemagickerror - Guardar imagen de URL con clip
rails carrierwave (7)
Aquí hay una manera simple:
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"
Por favor sugiérame una forma de guardar una imagen de una URL con Paperclip.
Como esos son viejos Respuesta aquí hay uno más nuevo:
Agregar URL remota de imagen al 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, debe agregar attr_accessible en el Controlador.
Actualice su formulario, si permite que otro cargue una Imagen desde una URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
En Paperclip 3.1.4 se ha vuelto aún más simple.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Esto es ligeramente mejor que abrir (url). Porque con open (url) obtendrás "stringio.txt" como nombre de archivo. Con lo anterior, obtendrá un nombre propio del archivo basado en 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"
Este es un método 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)
donde Uuid.uuid solo hace una identificación aleatoria.
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
Mi versión de 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 reemplazo con el tipo de contenido correcto, no funcionaría.
Primero descargue la imagen con la gema del curb
a un TempFile
y luego simplemente asigne el objeto del tempfile y guarde su modelo.
Puede ser útil para ti. Aquí está el código que usa clip y la imagen presente en la 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