Guardar imagen de URL con clip

Por favor sugiérame una forma de guardar una imagen de una URL con Paperclip.

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://sofes.miximages.com/ruby-on-rails/ps_logo2.png" 

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" 

Primero descargue la imagen con la gem del curb a un TempFile y luego simplemente asigne el objeto del tempfile y guarde su modelo.

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.

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 

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

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.