2010-10-29 24 views

risposta

146

Ecco un modo semplice:

Poi basta:

user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png" 
+0

Ho bisogno di utilizzare update_attribute per qualche motivo. –

+0

Semplice ed efficace. Grazie uomo. – goo

+7

Se è necessario utilizzare 'update_attributes' rinominare' picture_from_url' in 'picture_url = (valore)' ad esempio. –

15

Prima scaricare l'immagine con la gemma curb su TempFile e quindi assegnare semplicemente l'oggetto tempfile e salvare il modello.

+2

non vedo cosa c'è di sbagliato con questa risposta, il voto in su perche' sto vedendo un voto basso. – jpemberthy

+0

Questa è la risposta più performante ([di gran lunga] (http://toevolve.org/2011/04/03/http-request-performance.html)).Non sono un vero appassionato di prestazioni, ma questo si aggiunge davvero se si lavora con file di grandi dimensioni. – Chip

2

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 fa solo un po 'di ID casuale.

2

Può utile a voi. 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 
185

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. cioè

self.picture = URI.parse("http://something.com/blah/avatar.png") 

self.picture_file_name # => "avatar.png" 
self.picture_content_type # => "image/png" 
+0

Come si può ottenere questo funzionamento se si è dietro un proxy? – Sebastian

+3

Da paperclip wiki: https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL L'ho eseguito correttamente in console, l'app è in heroku. –

+3

FYI, per gli URL S3 ottengo ancora 'application/octet_stream' come' content_type'. –

3

Come quelli sono vecchi risposta di qui è una più recente:

Aggiungi immagine URL remoto per il controller desiderato nel database

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

Modificare il 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.

aggiornare il modulo, se si consente loro di caricare un'immagine da un URL

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

a cosa serve il 'super'? –

+0

La funzione 'super' è usata per invocare il metodo originale, la ricerca del corpo del metodo inizia nella super classe dell'oggetto che è stato trovato per contenere il metodo originale –

10

Non ha funzionato per me fino a quando ho usato "aperto" per URI analizzato. una volta che ho aggiunto "aperto" ha funzionato!

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

La mia versione è 4.2.1 graffetta

Prima aperto non sarebbe rilevare il tipo di contenuto a destra, 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.