जवाबों:
यहाँ एक आसान तरीका है:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
फिर बस:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
। यह ज्यादातर स्थितियों में शायद ठीक है।
open(url)
, फ़ाइल नाम सटीक नहीं है, उदाहरण open-uri20150106-10034-lpd5fm.
के लिए ef3a601e_ef3d008b_ef3d0f7e.jpg
।
पेपरक्लिप 3.1.4 में यह और भी सरल हो गया है।
def picture_from_url(url)
self.picture = URI.parse(url)
end
यह खुले (url) से थोड़ा बेहतर है। क्योंकि खुले (यूआरएल) के साथ आपको फ़ाइल नाम के रूप में "stringio.txt" मिलने वाला है। ऊपर आप URL पर आधारित फ़ाइल का एक उचित नाम प्राप्त करने जा रहे हैं। अर्थात
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
रूप में मिलता है content_type
।
यह मेरे लिए तब तक काम नहीं आया जब तक कि मैंने यूआरआई के लिए "ओपन" का इस्तेमाल नहीं किया। एक बार जब मैंने "ओपन" जोड़ा तो यह काम कर गया!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
मेरा पेपरक्लिप संस्करण 4.2.1 है
खोलने से पहले यह सामग्री प्रकार का सही पता नहीं लगाएगा, क्योंकि यह एक फ़ाइल नहीं थी। यह कहेगा image_content_type: "बाइनरी / ऑक्टेट-स्ट्रीम", और यहां तक कि अगर मैं इसे सही सामग्री के साथ ओवरराइड करता हूं तो यह काम नहीं करेगा।
सबसे पहले curb
मणि के साथ छवि को डाउनलोड करें TempFile
और फिर टेंपफ़ाइल ऑब्जेक्ट को असाइन करें और अपने मॉडल को सहेजें।
यह आपके लिए मददगार हो सकता है। यहां दूरस्थ URL में पेपरक्लिप और छवि का उपयोग करके कोड है।
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
मॉडल में
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
जैसा कि वे पुराने उत्तरदाता हैं यहां एक नया है:
डेटाबेस में अपने इच्छित नियंत्रक में छवि दूरस्थ URL जोड़ें
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
अपने मॉडल को संपादित करें
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 में आपको नियंत्रक में attr_accessible को जोड़ना होगा।
यदि आप किसी URL से चित्र अपलोड करने की अनुमति देते हैं, तो अपना फ़ॉर्म अपडेट करें
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
लिए है?
super
का उपयोग मूल विधि को लागू करने के लिए किया जाता है, विधि बॉडी की खोज उस ऑब्जेक्ट के सुपर क्लास में शुरू होती है जिसमें मूल विधि शामिल थी
यह एक कट्टर तरीका है:
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)
जहां Uuid.uuid बस कुछ यादृच्छिक आईडी बनाता है।
आधिकारिक दस्तावेज में यहाँ बताया गया है https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
वैसे भी यह अपडेटेड नहीं लगता है, क्योंकि पिछले साल के पेपरक्लिप के संस्करण में कुछ बदल गया है और कोड की यह रेखा अधिक वैध नहीं है:
user.picture = URI.parse(url)
यह एक त्रुटि उठाता है, विशेष रूप से यह त्रुटि उठाई जाती है:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
नया सही सिंटैक्स यह है:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
इसके अलावा हमें इन पंक्तियों को config / initializers / paperclip.rb फ़ाइल में जोड़ना होगा :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
5.3.0
इसे पेपरक्लिप वर्जन के साथ टेस्ट किया गया और यह काम करता है।
update_attributes
नाम बदलनेpicture_from_url
के लिएpicture_url=(value)
उदाहरण के लिए।