Yanıtlar:
İşte basit bir yol:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
O zaman basitçe:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Yine de çoğu durumda muhtemelen iyidir.
open(url)
, dosya adı doğru değildir, örneğin open-uri20150106-10034-lpd5fm.
yerine ef3a601e_ef3d008b_ef3d0f7e.jpg
.
Paperclip 3.1.4'te daha da basit hale geldi.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Bu open (url) 'den biraz daha iyidir. Çünkü open (url) ile dosya adı olarak "stringio.txt" alacaksınız. Yukarıdakilerle, URL'ye bağlı olarak dosyanın uygun bir adını alacaksınız. yani
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
olarak content_type
.
Ayrıştırılmış URI için "açık" kullanana kadar işime yaramadı. "aç" ı ekledikten sonra işe yaradı!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Ataç sürümüm 4.2.1
Açmadan önce, bir dosya olmadığı için içerik türünü doğru algılamıyordu. İmage_content_type: "binary / octet-stream" derdi ve onu doğru içerik türüyle geçersiz kılsam bile işe yaramaz.
Önce curb
gem ile görüntüyü TempFile
a'ya indirin ve ardından geçici dosya nesnesini atayın ve modelinizi kaydedin.
Size yardımcı olabilir. Uzak URL'de bulunan ataş ve görüntü kullanan kod.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
Modelde
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Bunlar eski olduğu için, Cevaplayanlar işte daha yenisi:
Veritabanında istediğiniz Denetleyiciye Image Remote URL ekleyin
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Modelinizi düzenleyin
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
* Rails4'te, Denetleyiciye attr_accessible eklemeniz gerekir.
Başkalarının bir URL'den Resim yüklemesine izin verirseniz, formunuzu güncelleyin
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
için
super
, orijinal yöntemi çağırmak için kullanılır, yöntem gövdesinin aranması, orijinal yöntemi içerdiği bulunan nesnenin süper sınıfında başlar
Bu sert bir yöntemdir:
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)
burada Uuid.uuid rastgele bir kimlik oluşturur.
Resmi belgelere burada https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL bildirilir
Her neyse, güncellenmemiş gibi görünüyor, çünkü ataşın son sürümünde bir şeyler değişti ve bu kod satırı artık geçerli değil:
user.picture = URI.parse(url)
Bir hata ortaya çıkarır, özellikle şu hata ortaya çıkar:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
Yeni doğru sözdizimi şudur:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Ayrıca bu satırları config / initializers / paperclip.rb dosyasına eklememiz gerekiyor :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Bunu ataç versiyonu ile test etti 5.3.0
ve işe yarıyor.
update_attributes
yeniden adlandırmapicture_from_url
içinpicture_url=(value)
örneğin.