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_streamals 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 curbEdelstein auf a herunter TempFileund 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?
                    superwird 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.0und es funktioniert.
update_attributesUmbenennungspicture_from_urlumpicture_url=(value)zum Beispiel.