পেপারক্লিপ দ্বারা চিত্রটি URL থেকে সংরক্ষণ করুন


119

পেপারক্লিপ দ্বারা একটি URL থেকে একটি চিত্র সংরক্ষণ করার জন্য দয়া করে আমাকে একটি উপায় প্রস্তাব করুন।

উত্তর:


154

এখানে একটি সহজ উপায়:

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"

7
উদাহরণস্বরূপ আপনার যদি update_attributesপুনরায় নাম ব্যবহার picture_from_urlকরতে হয় picture_url=(value)
ড্যানিয়েল রিকোভস্কি

3
এটি সম্ভবত অনিরাপদ কারণ কোনও ব্যবহারকারী কল করতে পারে user.picture_from_url('/etc/password')। যদিও বেশিরভাগ পরিস্থিতিতে সম্ভবত এটি ঠিক আছে।
ডেভিড টুয়েট

1
সুরক্ষার জন্য, আপনার ইউআরআই-এর স্কিমটি হোয়াইটলিস্ট করা উচিত এবং ব্যক্তিগত হোস্টকে কালো তালিকাভুক্ত করা উচিত
জন দৌহাত

3
আরও ভাল সমাধানের জন্য নীচে উত্তর দেখুন।
গাইকাজয়েড

6
ব্যবহার করে open(url), ফাইলের নামটি সঠিক নয়, যেমন open-uri20150106-10034-lpd5fm.পরিবর্তে ef3a601e_ef3d008b_ef3d0f7e.jpg
জোশুয়া পিন্টার

196

পেপারক্লিপ ৩.১.৪ এ এটি আরও সহজ হয়ে উঠেছে।

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"

3
পেপারক্লিপ উইকি থেকে: github.com/thoughtbot/paperclip/wiki/… আমি এটিকে সফলভাবে কনসোলে চালিয়েছি, অ্যাপটি হিরকুতে রয়েছে।
ডনি করনিয়া

3
অবগতির জন্য, এস 3 URL- এর আমি এখনও পেতে application/octet_streamহিসাবে content_type
জোশুয়া পিন্টার

5
আপনি যদি পেপারক্লিপটি হ্রাসের পরেও ব্যবহার করছেন তবে আপনার ইউআরআই আইও লোডার লোড হয়েছে কিনা তাও নিশ্চিত করতে হবে: পেপারক্লিপ :: ইউরিএডাপ্টার.গ্রিস্টার (কনফিলে, বা অস্থায়ীভাবে কনসোলের মাধ্যমে আপনার যদি প্রয়োজন হয়)
উপস্থিতি

পদ্ধতিটি সঠিক তবে শেষ সংস্করণে সিনট্যাক্স পরিবর্তন হয়েছে! নীচে আমার উত্তরটি দেখুন => স্ট্যাকওভারফ্লো.com
দিয়েগো ডি

আপনাকে ইনিশিয়ালাইজার github.com/thoughtbot/paperclip/wiki/…
আইয়ানপেটজার

16

আমি পার্সড ইউআরআইয়ের জন্য "উন্মুক্ত" ব্যবহার না করা পর্যন্ত এটি আমার পক্ষে কার্যকর হয়নি। একবার আমি যুক্ত "খোলা" এটি কাজ করে!

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

আমার পেপারক্লিপ সংস্করণটি 4.2.1

খোলার আগে এটি সামগ্রীর ধরণটি সঠিকভাবে সনাক্ত করতে পারে না কারণ এটি কোনও ফাইল নয়। এটি চিত্র_ কনটেন্ট_ টাইপ বলবে: "বাইনারি / অক্টেট-স্ট্রিম", এবং আমি এটি সঠিক সামগ্রীর ধরণের সাথে ওভাররাইড করলেও এটি কার্যকর হবে না।


এর জন্য ধন্যবাদ! ঠিক কী আমি নিজেকে মিস করছি।
ড্যান

আপনি যদি এটি করেন তবে আপনি আপনার এক্সেনশন হারাবেন। আপনার প্রারম্ভকালে পেপারক্লিপ :: ইউরিএডাপ্টার.রেজিস্টার লাগবে .. তারপরে আপনার শেষে .open দরকার নেই। Github.com/thoughtbot/paperclip/wiki/…
ianpetzer

15

প্রথমে একটিকে curbরত্ন দিয়ে চিত্রটি ডাউনলোড করুন TempFileএবং তারপরে কেবল টেম্পাইল ফাইলটি নির্ধারণ করুন এবং আপনার মডেলটি সংরক্ষণ করুন।


2
আমি এই উত্তরটির সাথে কী দোষ দেখছে না, এটি ভোটাভুটি করার কারণে আমি ডাউন ভোট দেখছি।
জেপেম্বারথি

এটি সর্বাধিক পারফরম্যান্স উত্তর (খুব দূরে )। আমি প্রকৃতপক্ষে কোনও পারফরম্যান্স-গীক নই, তবে আপনি যদি ডাব্লু / বড় ফাইলগুলিতে কাজ করে থাকেন তবে এটি সত্যিই জুড়ে যায়।
চিপ

3

এটি আপনার পক্ষে সহায়ক হতে পারে। রিমোট ইউআরএলে উপস্থিত পেপারক্লিপ এবং চিত্র ব্যবহার করে কোডটি এখানে।

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

3

সেগুলি পুরানো উত্তর হিসাবে এখানে একটি নতুন উত্তর:

ডেটাবেসে আপনার কাঙ্ক্ষিত নিয়ামকটিতে চিত্র দূরবর্তী 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মূল পদ্ধতিটি আহ্বান করতে ব্যবহৃত হয়, মূল পদ্ধতিটি পাওয়া যায় এমন বস্তুর সুপার ক্লাসে পদ্ধতিটির শরীরের সন্ধান শুরু হয়
মিনি জন

2

এটি একটি কঠিন পদ্ধতি:

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)

যেখানে ইউইড.ইউইড কিছু র্যান্ডম আইডি তৈরি করে।


2

অফিসিয়াল ডকুমেন্টেশনের জন্য এখানে 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এটি পেপারক্লিপ সংস্করণ দিয়ে পরীক্ষা করেছে এবং এটি কাজ করে।


এটির জন্য ধন্যবাদ - কনফিগার সামগ্রীগুলি এটি আমার জন্য ঠিক করেছে (পেপারক্লিপ v6.1.0)
ওলভার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.