আমি কীভাবে কোনও ইউআরএল থেকে একটি ফাইল ডাউনলোড করতে পারি এবং তা কীভাবে রেলগুলিতে সংরক্ষণ করতে পারি?


197

আমার কাছে একটি চিত্রের একটি URL রয়েছে যা আমি স্থানীয়ভাবে সংরক্ষণ করতে চাই, যাতে আমি আমার অ্যাপ্লিকেশনটির জন্য একটি থাম্বনেইল তৈরি করতে পেপারক্লিপ ব্যবহার করতে পারি। চিত্রটি ডাউনলোড এবং সংরক্ষণের সর্বোত্তম উপায় কী? (আমি রুবি ফাইল হ্যান্ডলিংয়ের দিকে নজর দিয়েছি তবে কিছুই আসে নি))

উত্তর:


315

এটা চেষ্টা কর:

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

1
এইটা কাজ করে. ধন্যবাদ। আমি একটি ইমেজ এ চেষ্টা করেছি। চিত্রটি সঠিকভাবে ফাইলটিতে লেখা হয়নি। যেন এটি দূষিত হয়েছে বা কিছু হয়েছে something এছাড়াও আপনি কি আমাকে একটি রেল অ্যাপ্লিকেশনটিতে এটি করতে গাইড করতে পারেন। আমি কি এটি একটি রেল অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারি?
অলোক সোয়েন

হ্যাঁ, আপনি এটি রেল অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারেন। ফাইলটি সঠিকভাবে লেখা হচ্ছে না কারণ সম্ভবত আমি লিখিত-বাইনারি মোডে গন্তব্যটি খুলতে ভুলে গিয়েছি। আমি এখন এটি সম্পাদনা করব।
লেবি

78
এটি মেমরির পুরো ফাইলটি পড়ে। সর্বোত্তম উপায় হ'লIO.copy_stream(open('http://example.com/image.png'), 'destination.png')
জাঙ্কো-এম

3
রেল 5, 2016, আমার প্রয়োজন নেই require 'open-uri', কেবল এটির অধীনে কোডটি ব্যবহার করা হয়েছে
মিরর 318

1
এই উত্তরটি আমার পক্ষে কার্যকর হয়নি। সঠিক উত্তরটি এখানে: স্ট্যাকওভারফ্লো.com
ব্লেয়ার অ্যান্ডারসন

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
Itay গ্রুদেব

2
যদিও এটি উভয় উত্তর প্রদর্শিত হয়েছে তা সত্যই কার্যকর, সুতরাং আমার মতো লোকেরা উভয়ই দেখতে পাবে, পার্থক্যগুলি সম্পর্কে চিন্তাভাবনা করতে পারে এবং সঠিক কারণগুলির জন্য সচেতনভাবে এই উত্তরটি বেছে নিতে পারে :)
ম্যাক্সওয়েল ইভান্স

30

আপনি যদি পেপারক্লিপ ব্যবহার করছেন তবে কোনও ইউআরএল থেকে ডাউনলোড করা এখন স্বয়ংক্রিয়ভাবে পরিচালিত হবে।

ধরে নিচ্ছি আপনার মতো কিছু পাওয়া গেছে:

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
ভবিষ্যতের সন্ধানকারীদের জন্য, পেপারক্লিপটি আর ডিফল্টরূপে এটি অনুমতি দেয় না: मध्यम.com
অ্যালেক্স ডুনা

14

আমি মনে করি এটিই পরিষ্কার উপায়:

require 'open-uri'

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


1
এটি নির্ভর করে, তবে সাধারণত আপনি কোনও মডেল বা নিয়ামক পদ্ধতির অভ্যন্তরে এরকম কিছু করতে চান। একটি রেল প্রসঙ্গে আপনি সম্ভবত ডিস্কে সরাসরি লেখার চেয়ে ফ্রেমওয়ার্কের সরঞ্জামগুলি অ্যাক্টিভ স্টোরেজের মতো ব্যবহার করা ভাল।
সেজে রস

10

পরীক্ষা করে দেখুন নিট :: HTTP- র মান লাইব্রেরিতে। ডকুমেন্টেশনটি এইচটিটিপি ব্যবহার করে কীভাবে ডকুমেন্টগুলি ডাউনলোড করবেন সে সম্পর্কে বেশ কয়েকটি উদাহরণ সরবরাহ করে।


2
এই উত্তরের আরও দৃশ্যমানতা প্রয়োজন কারণ Kernel#openকেবল ফাইল অ্যাক্সেসই সক্ষম করে না তবে পাইপের প্রতীক (উদাহরণস্বরূপ open("| ls")) উপসর্গের মাধ্যমে অনুরোধ প্রক্রিয়া করে । সুতরাং, এর যুক্তিতে ভেরিয়েবল ইনপুট ব্যবহার করে এটি একটি গুরুতর সুরক্ষা ঝুঁকির দিকে নিয়ে যেতে পারে Kernel#open
কনারবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.