উত্তর:
এখানে একটি সহজ উপায়:
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
।
পেপারক্লিপ ৩.১.৪ এ এটি আরও সহজ হয়ে উঠেছে।
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
খোলার আগে এটি সামগ্রীর ধরণটি সঠিকভাবে সনাক্ত করতে পারে না কারণ এটি কোনও ফাইল নয়। এটি চিত্র_ কনটেন্ট_ টাইপ বলবে: "বাইনারি / অক্টেট-স্ট্রিম", এবং আমি এটি সঠিক সামগ্রীর ধরণের সাথে ওভাররাইড করলেও এটি কার্যকর হবে না।
প্রথমে একটিকে curb
রত্ন দিয়ে চিত্রটি ডাউনলোড করুন TempFile
এবং তারপরে কেবল টেম্পাইল ফাইলটি নির্ধারণ করুন এবং আপনার মডেলটি সংরক্ষণ করুন।
এটি আপনার পক্ষে সহায়ক হতে পারে। রিমোট ইউআরএলে উপস্থিত পেপারক্লিপ এবং চিত্র ব্যবহার করে কোডটি এখানে।
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
* রেলস 4 এ আপনাকে কন্ট্রোলারে অ্যাট্রি_স্যাক্সেসযোগ্য যুক্ত করতে হবে।
আপনার ফর্মটি আপডেট করুন, যদি আপনি অন্যকে কোনও 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)
যেখানে ইউইড.ইউইড কিছু র্যান্ডম আইডি তৈরি করে।
অফিসিয়াল ডকুমেন্টেশনের জন্য এখানে 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 })
এছাড়াও আমাদের এই লাইনগুলিকে কনফিগার / ইনিশিয়েলাইজার / পেপারক্লিপ.আরবি ফাইলে যুক্ত করতে হবে:
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
5.3.0
এটি পেপারক্লিপ সংস্করণ দিয়ে পরীক্ষা করেছে এবং এটি কাজ করে।
update_attributes
পুনরায় নাম ব্যবহারpicture_from_url
করতে হয়picture_url=(value)
।