Bild von URL per Büroklammer speichern

Bitte schlage mir vor, wie ich ein Bild von einer URL per Paperclip speichern kann.

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

In Paperclip 3.1.4 ist es noch einfacher geworden.

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

Das ist etwas besser als offen (URL). Weil du mit open (url) “stringio.txt” als Dateinamen bekommst. Mit dem oben genannten erhalten Sie einen korrekten 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" 

Laden Sie zuerst das Bild mit dem curb TempFile in eine TempFile und weisen Sie dann einfach das Tempfile-Objekt zu und speichern Sie Ihr Modell.

Es funktionierte nicht für mich, bis ich für geparste URI “offen” verwendete. Sobald ich “offen” hinzugefügt habe, hat es funktioniert!

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

Meine Büroklammer Version ist 4.2.1

Vor dem Öffnen wurde der Inhaltstyp nicht richtig erkannt, weil es keine Datei war. Es würde sagen image_content_type: “binary / octet-stream”, und selbst wenn ich es mit dem richtigen Inhaltstyp überschreiben würde, würde es nicht funktionieren.

Es kann hilfreich für Sie sein. Hier ist der Code mit Büroklammer und Bild in Remote-URL vorhanden.

 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 das alte Antwort ist hier ist ein neuer:

Fügen Sie dem gewünschten Controller in der database 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 das 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" %> 

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.