Odpowiedzi:
Oto prosty sposób:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Następnie po prostu:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Jednak prawdopodobnie jest w porządku w większości sytuacji.
open(url)
, nazwa pliku nie jest dokładna, np. open-uri20150106-10034-lpd5fm.
Zamiast ef3a601e_ef3d008b_ef3d0f7e.jpg
.
W Paperclip 3.1.4 stało się to jeszcze prostsze.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Jest to nieco lepsze niż open (url). Ponieważ w przypadku open (url) jako nazwę pliku otrzymasz „stringio.txt”. Z powyższym otrzymasz właściwą nazwę pliku na podstawie adresu URL. to znaczy
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
jako content_type
.
U mnie nie działało, dopóki nie użyłem „open” dla przeanalizowanego identyfikatora URI. po dodaniu „otwórz” zadziałało!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Moja wersja spinacza to 4.2.1
Przed otwarciem nie wykryłby prawidłowego typu zawartości, ponieważ nie był to plik. Powiedziałby image_content_type: "binarny / strumień oktetu", a nawet gdybym nadpisał go odpowiednim typem treści, nie zadziała.
Najpierw pobierz obraz z curb
klejnotem do pliku, TempFile
a następnie po prostu przypisz obiekt tymczasowego pliku i zapisz model.
Może ci się to przydać. Oto kod wykorzystujący spinacz i obraz obecny w zdalnym adresie URL.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
W modelu
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Ponieważ to są stare Odpowiedź, oto nowsza:
Dodaj zdalny adres URL obrazu do żądanego kontrolera w bazie danych
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Edytuj swój model
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
* W Rails4 musisz dodać attr_accessible w kontrolerze.
Zaktualizuj swój formularz, jeśli zezwalasz innym na przesyłanie obrazu z adresu URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
za?
super
służy do wywoływania oryginalnej metody, wyszukiwanie treści metody rozpoczyna się w superklasie obiektu, w którym znaleziono oryginalną metodę
To jest metoda 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)
gdzie Uuid.uuid po prostu tworzy losowy identyfikator.
Do oficjalnej dokumentacji zgłoszono tutaj https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
W każdym razie wygląda na to, że nie został zaktualizowany, ponieważ w ostatniej wersji spinacza coś się zmieniło i ta linia kodu nie jest już poprawna:
user.picture = URI.parse(url)
Podnosi błąd, w szczególności ten błąd jest podnoszony:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
Nowa poprawna składnia to:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Musimy również dodać te linie do pliku config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Przetestowałem to z wersją spinacza 5.3.0
i działa.
update_attributes
Zmień nazwępicture_from_url
, abypicture_url=(value)
na przykład.