ruby - रुबी में मल्टीपार्ट फ़ाइल अपलोड करें




http upload (2)

एक और तरीका है बाश और कर्ल का उपयोग करना जब मैं एकाधिक फ़ाइल अपलोड परीक्षण करना चाहता था तो मैंने इस विधि का उपयोग किया था

bash_command = 'curl -v -F "[email protected],texas_reversed.png"                         
http://localhost:9292/fog_upload/upload'
command_result = `#{bash_command}` # the backticks are important <br/>
puts command_result

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

अपने आवेदन में मैं ज्यादातर चीजों के लिए WWW :: Mechanize का उपयोग कर रहा हूं ताकि मैं इसे इसके लिए भी इस्तेमाल करना चाहता हूं, और इस तरह एक स्रोत था:

f = File.new(filename, File::RDWR)
reply = agent.post(
    'http://rest-test.heroku.com',
    {
         :pict       =>  f,
         :function   =>  'picture2',
         :username   =>  @username,
         :password   =>  @password,
         :pict_to    =>  0,
         :pict_type  =>  0
    }
)
f.close

इससे सर्वर पर एक पूरी तरह से कचरा-तैयार फ़ाइल होती है, जो कि सभी चित्रों को तले हुए दिखती है:

वैकल्पिक पाठ http://imagehub.org/f/1tk8/garbage.png

मेरा अगला कदम डाउनग्रेड WWW :: संस्करण 0.8.5 करने के लिए मशीनीज था। जब तक मैंने इसे चलाने की कोशिश की, तब तक काम किया, जो "hpricot_scan.so में नहीं मिला मॉड्यूल" जैसी एक त्रुटि के साथ विफल रहे। निर्भरता वाकर उपकरण का उपयोग करके मुझे पता चला कि hpricot_scan.so आवश्यक msvcrt-ruby18.dll। फिर भी मैंने अपने रुबी / बिन-फ़ोल्डर में डालने के बाद इसे खाली त्रुटि बॉक्स दिया, जहां से मैं बहुत ज्यादा डिबग नहीं कर सका। इसलिए यहां समस्या यह है कि 0.8.5 के तंत्रिकीकरण को नोकोगिरी के बजाय एचपी्रिकोट पर निर्भरता (जो बिना दोषहीन काम करता है) है।

अगला विचार एक अलग मणि का उपयोग करना था, इसलिए मैंने नेट :: HTTP का उपयोग करने की कोशिश की छोटे शोध के बाद मुझे पता चला कि नेट :: HTTP में मल्टीपार्ट रूपों के लिए कोई देशी समर्थन नहीं है और इसके बजाय आपको एक ऐसा वर्ग बनाना होगा जो आपके लिए एन्कोड आदि। स्टैनिस्लाव विटविट्स्की द्वारा बहुभाषी-श्रेणी में सबसे उपयोगी मुझे मिल सकता था इस कक्षा में अभी तक अच्छा दिख रहा है, लेकिन यह मेरी जरूरत नहीं है, क्योंकि मैं केवल फाइल पोस्ट नहीं करना चाहता, मैं भी सामान्य डेटा पोस्ट करना चाहता हूं, और यह उसकी कक्षा के साथ संभव नहीं है।

मेरा अंतिम प्रयास RestClient का उपयोग करना था यह आशाजनक लग रहा था, क्योंकि फाइलें कैसे अपलोड करें के उदाहरण हैं फिर भी मैं इसे रूप में मल्टीपार्ट के रूप में पोस्ट करने के लिए नहीं मिल सकता है।

f = File.new(filename, File::RDWR)
reply = RestClient.post(
    'http://rest-test.heroku.com',
    :pict       =>  f,
    :function   =>  'picture2',
    :username   =>  @username,
    :password   =>  @password,
    :pict_to    =>  0,
    :pict_type  =>  0
)
f.close

मैं http://rest-test.heroku.com का उपयोग कर रहा हूं जो इसे ठीक से भेजा गया है, तो डीबग करने का अनुरोध वापस भेजता है, और मैं हमेशा इसे वापस प्राप्त करता हूं:

POST http://rest-test.heroku.com/ with a 101 byte payload,
content type application/x-www-form-urlencoded
{
    "pict" => "#<File:0x30d30c4>",
    "username" => "s1kx",
    "pict_to" => "0",
    "function" => "picture2",
    "pict_type" => "0",
    "password" => "password"
}

यह स्पष्ट रूप से दिखाता है कि यह multipart/form-data को सामग्री प्रकार के रूप में नहीं बल्कि मानक application/x-www-form-urlencoded उपयोग नहीं करता है, यद्यपि यह निश्चित रूप से यह देखता है कि pict एक फाइल है

संपूर्ण एन्कोडिंग और डेटा को संरेखित करने के बिना मल्टीपार्ट फॉर्म में रूबी में मैं एक फ़ाइल कैसे अपलोड कर सकता हूं?


लंबी समस्या, संक्षिप्त जवाब: मैं विंडोज के अंतर्गत छवि को पढ़ने के लिए बाइनरी मोड को याद कर रहा था

f = File.new(filename, File::RDWR)

होना था

f = File.new(filename, "rb")





multipart