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
सुरक्षा के लिए, आपको URI की योजना को श्वेत सूची में डालना चाहिए और निजी होस्ट को ब्लैकलिस्ट करना चाहिए
John Douthat

3
बेहतर समाधान के लिए नीचे उत्तर देखें।
geekazoid

6
का उपयोग करते हुए open(url), फ़ाइल नाम सटीक नहीं है, उदाहरण open-uri20150106-10034-lpd5fm.के लिए ef3a601e_ef3d008b_ef3d0f7e.jpg
जोशुआ पिंटर

196

पेपरक्लिप 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"

3
पेपरली विकी से: github.com/thoughtbot/paperclip/wiki/… मैं इसे सफलतापूर्वक कंसोल में चलाता हूं, ऐप हरोकू में है।
डॉनी कुर्निया

3
FYI करें, S3 यूआरएल के लिए मैं अभी भी के application/octet_streamरूप में मिलता है content_type
जोशुआ पिंटर

5
अगर आप पदावनति के बाद भी पेपरक्लिप का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करने की भी आवश्यकता हो सकती है कि यूआरआई आईओ लोडर लोड हो गया है: पेपरलीक :: उरीएडस्केप.ग्रिस्टर (अस्थायी रूप से, या अस्थायी रूप से कंसोल के माध्यम से अगर आपको ज़रूरत है
Msencenb

दृष्टिकोण सही है लेकिन अंतिम संस्करण में सिंटैक्स को बदल दिया गया है! नीचे मेरे जवाब की जाँच करें => stackoverflow.com/a/56039191/3182171
डिएगो D

आपको इनिशियलाइज़र github.com/thoughtbot/paperclip/wiki/…
ianpetzer

16

यह मेरे लिए तब तक काम नहीं आया जब तक कि मैंने यूआरआई के लिए "ओपन" का इस्तेमाल नहीं किया। एक बार जब मैंने "ओपन" जोड़ा तो यह काम कर गया!

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

मेरा पेपरक्लिप संस्करण 4.2.1 है

खोलने से पहले यह सामग्री प्रकार का सही पता नहीं लगाएगा, क्योंकि यह एक फ़ाइल नहीं थी। यह कहेगा image_content_type: "बाइनरी / ऑक्टेट-स्ट्रीम", और यहां तक ​​कि अगर मैं इसे सही सामग्री के साथ ओवरराइड करता हूं तो यह काम नहीं करेगा।


इसके लिए धन्यवाद! बिल्कुल वही जो मुझे खुद याद आ रहा था।
दान

यदि आप ऐसा करते हैं तो आप अपना तनाव खो देंगे। आपको कागज़ की आवश्यकता है :: इनिशियलाइज़र में UriAdapter.register .. तो आपको अंत में कोई आवश्यकता नहीं है। देखें github.com/thoughtbot/paperclip/wiki/...
ianpetzer

15

सबसे पहले curbमणि के साथ छवि को डाउनलोड करें TempFileऔर फिर टेंपफ़ाइल ऑब्जेक्ट को असाइन करें और अपने मॉडल को सहेजें।


2
मुझे नहीं लगता कि इस जवाब में क्या गलत है, इसे वोट करना क्योंकि मैं एक डाउन वोट देख रहा हूं।
jpemberthy

यह सबसे अधिक जवाब देने वाला उत्तर है ( अब तक )। मैं वास्तव में एक प्रदर्शन-geek नहीं हूं, लेकिन यह वास्तव में जोड़ता है यदि आप w / बड़ी फाइलें काम कर रहे हैं।
चिप

3

यह आपके लिए मददगार हो सकता है। यहां दूरस्थ 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

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

* Rails4 में आपको नियंत्रक में attr_accessible को जोड़ना होगा।

यदि आप किसी 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)

जहां Uuid.uuid बस कुछ यादृच्छिक आईडी बनाता है।


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 })

इसके अलावा हमें इन पंक्तियों को config / initializers / paperclip.rb फ़ाइल में जोड़ना होगा :

Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register

5.3.0इसे पेपरक्लिप वर्जन के साथ टेस्ट किया गया और यह काम करता है।


इसके लिए धन्यवाद - विन्यास सामग्री ने इसे मेरे लिए तय किया (पेपरक्लिप v6.1.0)
उल्लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.