मैं URL से फ़ाइल कैसे डाउनलोड कर सकता हूं और इसे रेल में सहेज सकता हूं?


197

मेरे पास एक छवि के लिए एक URL है जिसे मैं स्थानीय रूप से सहेजना चाहता हूं, ताकि मैं अपने आवेदन के लिए थंबनेल बनाने के लिए पेपरक्लिप का उपयोग कर सकूं। छवि को डाउनलोड करने और सहेजने का सबसे अच्छा तरीका क्या है? (मैंने रूबी फ़ाइल हैंडलिंग में देखा, लेकिन कुछ भी नहीं आया।)

जवाबों:


315

इसे इस्तेमाल करे:

require 'open-uri'
open('image.png', 'wb') do |file|
  file << open('http://example.com/image.png').read
end

1
यह काम। धन्यवाद। मैंने एक छवि पर यह कोशिश की। छवि को फ़ाइल में ठीक से नहीं लिखा गया था। मानो वह भ्रष्ट हो गया हो या कुछ और। इसके अलावा, आप मुझे एक ही रेल एप्लिकेशन में ऐसा करने के लिए मार्गदर्शन कर सकते हैं। क्या मैं इसका उपयोग रेल एप्लिकेशन में कर सकता हूं?
आलोक स्वैन

हां, आप इसका उपयोग रेल एप्लिकेशन में कर सकते हैं। फ़ाइल ठीक से नहीं लिखी जा रही है, शायद इसलिए कि मैं गंतव्य को राइट-बाइनरी मोड में खोलना भूल गया। अब मैं उसे संपादित करूँगा।
लेवि

78
यह पूरी फ़ाइल को मेमोरी में पढ़ता है। सबसे अच्छा तरीका हैIO.copy_stream(open('http://example.com/image.png'), 'destination.png')
janko-m

3
रेल 5, 2016, मुझे इसकी आवश्यकता नहीं थी require 'open-uri', बस इसके तहत कोड का इस्तेमाल किया
मिरर 318

1
यह जवाब मेरे काम नहीं आया। सही उत्तर यहाँ है: stackoverflow.com/a/29743394/1536309
ब्लेयर एंडरसन

147

इससे भी छोटा संस्करण:

require 'open-uri'
download = open('http://example.com/image.png')
IO.copy_stream(download, '~/image.png')

एक ही फ़ाइल नाम रखने के लिए:

IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")

2
और अधिक कुशल के रूप में उत्पादन स्मृति में एक स्ट्रिंग के रूप में संग्रहीत नहीं है। +1
इटाय ग्रुदेव

2
हालाँकि यह वास्तव में उपयोगी है कि दोनों उत्तर प्रदर्शित हैं, इसलिए मेरे जैसे लोग दोनों को देख सकते हैं, मतभेदों के बारे में सोच सकते हैं और फिर सही कारणों के लिए सचेत रूप से इस उत्तर को चुन सकते हैं :)
मैक्सवेल इवांस

30

यदि आप पेपरक्लिप का उपयोग कर रहे हैं, तो URL से डाउनलोड करना अब स्वचालित रूप से नियंत्रित हो जाएगा।

यह मानते हुए कि आपको कुछ मिला है:

class MyModel < ActiveRecord::Base
  has_attached_file :image, ...
end

अपने मॉडल पर, बस एक URL के रूप में छवि निर्दिष्ट करें, कुछ इस तरह से (जानबूझकर लंबे समय में लिखित):

@my_model = MyModel.new
image_url = params[:image_url]
@my_model.image = URI.parse(image_url)

आप शायद इसे अपने मॉडल में एक विधि में रखना चाहते हैं। यह हरोकू के अस्थायी फाइल सिस्टम पर भी ठीक काम करेगा।

पेपरक्लिप वहां से ले जाएगा।

स्रोत: पेपरक्लिप प्रलेखन


4
: भविष्य खोजकर्ताओं के लिए, पेपरक्लिप अब इस डिफ़ॉल्ट रूप से अनुमति देता है medium.com/in-the-weeds/...
एलेक्स Dunae

14

मुझे लगता है कि यह सबसे स्पष्ट तरीका है:

require 'open-uri'

File.write 'image.png', open('http://example.com/image.png').read

ऋषि मैं रेल के लिए नया हूं, जहां मैं इस कोड को मॉडल या नियंत्रक में या दृश्य में जोड़ सकता
हूं

1
यह निर्भर करता है, लेकिन आमतौर पर आप एक मॉडल या नियंत्रक विधि के अंदर ऐसा कुछ करेंगे। रेल संदर्भ में, आपको सीधे डिस्क पर लिखने के बजाय, ActiveStorage जैसे ढांचे के उपकरणों का उपयोग करने की संभावना बेहतर है।
ऋषि रोस

10

की जाँच करें Net :: HTTP मानक पुस्तकालय में। दस्तावेज़ HTTP का उपयोग करके दस्तावेज़ डाउनलोड करने के बारे में कई उदाहरण प्रदान करता है।


2
इस उत्तर को अधिक दृश्यता की आवश्यकता होती है क्योंकि Kernel#openयह न केवल फ़ाइल एक्सेस को सक्षम बनाता है बल्कि पाइप सिंबल (उदाहरण के लिए open("| ls")) को उपसर्ग करके भी मंगलाचरण की प्रक्रिया करता है । तो, यह तर्क के लिए चर इनपुट का उपयोग करके एक गंभीर सुरक्षा जोखिम को जन्म दे सकता है Kernel#open
कॉनरब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.