2011-08-05 14 views
6

मैं एक छवि के सामग्री-प्रकार और फ़ाइल नाम को पुनर्प्राप्त करने का प्रयास कर रहा हूं जिसे मैं बेस 64 एन्कोडेड प्रारूप में प्राप्त कर रहा हूं।रेल नाम पर बेस 64 एन्कोडेड छवि रूबी से फ़ाइल नाम और सामग्री-प्रकार पुनर्प्राप्त करें

यहाँ कोड है जो बेस 64 इनकोडिंग छवि

require 'net/http' 
require "rubygems" 
require 'active_support' 

url = URI.parse('http://localhost:3000/') 
image = ActiveSupport::Base64.encode64(open("public/images/rails.png").to_a.join) 
post_params = {'image' => image } 
Net::HTTP.post_form(url, post_params) 

नियंत्रक के साथ एक पोस्ट अनुरोध कर रहा है, मैं इस छवि की सामग्री प्रकार और फ़ाइल नाम पाने के लिए की जरूरत है। तो सबसे पहले मैं इसे

image = ActiveSupport::Base64.decode64(params[:image]) 
image_data = StringIO.new(image) 

और फिर मैं अटक गया हूँ!

मैं मूल रूप से पेपरक्लिप का उपयोग करके इस छवि को सहेजना चाहता हूं। कुछ गंभीर मदद की ज़रूरत है!

अद्यतन: मैं सामग्री प्रकार और फ़ाइल नाम के लिए पैरामीटर नहीं भेज सकते। मैं सिर्फ क्लाइंट की नकल कर रहा था जो इसे भेज रहा है (और मेरे पास अतिरिक्त पैरा जोड़ने पर कोई नियंत्रण नहीं है)

+0

क्या आप अभी एक और post_param नहीं जोड़ सकते हैं? कुछ '{filename' => 'rails.png'} – Serabe

+0

नहीं! मैं जिस एपीआई के लिए विकास कर रहा हूं, वह कोई अन्य पैराम नहीं भेजता है। केवल छवि डेटा एन्कोड किया गया। इसलिए, मैं जानना चाहता हूं कि यह कोई अन्य पैराम भेजने के बिना संभव है या नहीं। – Madhusudhan

+0

आप कुछ सहेजने के लिए उपयोगकर्ता द्वारा प्रदान किए गए फ़ाइल नाम का उपयोग करने के बारे में सोच नहीं रहे हैं, है ना? यह एक बुरा विचार है। –

उत्तर

4

आप विभिन्न ImageMagick पुस्तकालयों में से एक का उपयोग कर कच्चे बाइट्स को डिकोड कर सकता है और उसके बाद प्रारूप के लिए ImageMagick पूछना। उदाहरण के लिए, RMagick साथ के लिए:

require 'rmagick' 
bytes = ActiveSupport::Base64.decode64(params[:image]) 
img = Magick::Image.from_blob(bytes).first 
fmt = img.format 

कि तुम दे देंगे 'PNG', 'JPEG', fmt में आदि। ImageMagick जादू संख्याओं और अन्य पहचान जानकारी के लिए बाइट्स की जांच करता है, इसलिए यह जानने के लिए फ़ाइल नाम की आवश्यकता नहीं है कि आप किस प्रकार की छवि दे रहे हैं।

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

+0

या तो मुझे लगता है कि अब फ़ाइल नाम एक मुद्दा नहीं होना चाहिए, क्योंकि पेपरक्लिप उचित उदाहरणों से संबद्ध हो सकता है। मुझे बस सामग्री-प्रकार की ज़रूरत है। मुझे इसे आज़माएं। धन्यवाद! – Madhusudhan

+0

इसके लिए धन्यवाद, मैं प्रारूप 'पीएनजी' प्राप्त कर सकता हूं, मैं कम से कम सामग्री-प्रकार को 'छवि/पीएनजी' के रूप में सेट कर सकता हूं – Madhusudhan

0

फ़ाइल नाम के लिए, आप इसे पोस्ट क्यों नहीं करते हैं, आसान लगता है (post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 })। सामग्री-प्रकार खोजने के लिए आप ruby-filemagic जैसी लाइब्रेरी का उपयोग कर सकते हैं।

http://rubygems.org/gems/ruby-filemagic

+0

मैं जिस एपीआई के लिए विकास कर रहा हूं, वह कोई अन्य पैराम नहीं भेजता है। केवल छवि डेटा एन्कोड किया गया। क्या केवल एन्कोड किए गए डेटा से फ़ाइल नाम प्राप्त करना संभव है? मैंने php के साथ यह संभव सुना, मुझे यकीन था कि रूबी/रेल – Madhusudhan

+0

के साथ कोई रास्ता नहीं है जब तक कि फ़ाइल का नाम वास्तविक छवि डेटा का हिस्सा न हो - जो आईएमएचओ अजीब होगा - मुझे नहीं लगता कि यह कैसे समाप्त होगा बेस 64 एन्कोडेड स्ट्रिंग। क्या आप निश्चित हैं कि PHP के बारे में आपने जो कुछ सुना है, उदाहरण के लिए EXIF ​​से संबंधित नहीं था, जहां फ़ाइल नाम एम्बेडेड डेटा का हिस्सा हो सकता है? –

संबंधित मुद्दे