Antworten:
Hier ist ein einfacher Weg:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Dann einfach:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. In den meisten Situationen ist es wahrscheinlich in Ordnung.
open(url)
ist der Dateiname nicht korrekt, z . B. open-uri20150106-10034-lpd5fm.
anstelle von ef3a601e_ef3d008b_ef3d0f7e.jpg
.
In Paperclip 3.1.4 ist es noch einfacher geworden.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Dies ist etwas besser als offen (url). Denn mit open (url) erhalten Sie "stringio.txt" als Dateinamen. Mit dem oben genannten erhalten Sie einen richtigen Namen der Datei basierend auf der URL. dh
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
als content_type
.
Es hat bei mir nicht funktioniert, bis ich "open" für die analysierte URI verwendet habe. Sobald ich "open" hinzugefügt habe, hat es funktioniert!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Meine Büroklammerversion ist 4.2.1
Vor dem Öffnen wurde der Inhaltstyp nicht richtig erkannt, da es sich nicht um eine Datei handelte. Es würde image_content_type sagen: "binary / octet-stream", und selbst wenn ich es mit dem richtigen Inhaltstyp überschreibe, würde es nicht funktionieren.
Laden Sie zuerst das Bild mit dem curb
Edelstein auf a herunter TempFile
und weisen Sie dann einfach das tempfile-Objekt zu und speichern Sie Ihr Modell.
Es kann für Sie hilfreich sein. Hier ist der Code mit Büroklammer und Bild in der Remote-URL.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
Im Modell
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Da dies alte Antworten sind, ist hier eine neuere:
Fügen Sie Ihrem gewünschten Controller in der Datenbank eine Image-Remote-URL hinzu
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Bearbeiten Sie Ihr Modell
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 müssen Sie attr_accessible im Controller hinzufügen.
Aktualisieren Sie Ihr Formular, wenn Sie anderen erlauben, ein Bild von einer URL hochzuladen
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
?
super
wird verwendet, um die ursprüngliche Methode aufzurufen. Die Suche nach dem Methodenkörper beginnt in der Superklasse des Objekts, das die ursprüngliche Methode enthält
Dies ist eine Hardcore-Methode:
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)
wo Uuid.uuid nur eine zufällige ID macht.
In die offizielle Dokumentation wird hier https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL berichtet
Auf jeden Fall scheint es nicht aktualisiert zu sein, da sich in der letzten Version der Büroklammer etwas geändert hat und diese Codezeile nicht mehr gültig ist:
user.picture = URI.parse(url)
Es wird ein Fehler ausgelöst, insbesondere wird dieser Fehler ausgelöst:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
Die neue korrekte Syntax lautet:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Außerdem müssen wir diese Zeilen in die Datei config / initializers / paperclip.rb einfügen :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Getestet mit Büroklammer Version 5.3.0
und es funktioniert.
update_attributes
Umbenennungspicture_from_url
umpicture_url=(value)
zum Beispiel.