Per favore suggeriscimi un modo per salvare un'immagine da un URL di Paperclip.Salva immagine da URL con graffetta
risposta
Ecco un modo semplice:
Poi basta:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
Prima scaricare l'immagine con la gemma curb
su TempFile
e quindi assegnare semplicemente l'oggetto tempfile e salvare il modello.
non vedo cosa c'è di sbagliato con questa risposta, il voto in su perche' sto vedendo un voto basso. – jpemberthy
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
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.
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
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"
Come si può ottenere questo funzionamento se si è dietro un proxy? – Sebastian
Da paperclip wiki: https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL L'ho eseguito correttamente in console, l'app è in heroku. –
FYI, per gli URL S3 ottengo ancora 'application/octet_stream' come' content_type'. –
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" %>
a cosa serve il 'super'? –
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 –
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.
Ho bisogno di utilizzare update_attribute per qualche motivo. –
Semplice ed efficace. Grazie uomo. – goo
Se è necessario utilizzare 'update_attributes' rinominare' picture_from_url' in 'picture_url = (valore)' ad esempio. –