सबसे पहले यहाँ पढ़ें!
मुझे पता है कि यह 3 साल बहुत देर हो चुकी है, लेकिन मैट का (स्वीकृत) उत्तर अपूर्ण है और अंततः आपको परेशानी में डाल देगा। यहां कुंजी यह है कि, यदि आप उपयोग multipart/form-dataकरना चुनते हैं , तो सीमा उस फ़ाइल डेटा में नहीं दिखाई देनी चाहिए जो सर्वर अंततः प्राप्त करता है।
यह कोई समस्या नहीं है application/x-www-form-urlencoded, क्योंकि कोई सीमा नहीं है। x-www-form-urlencodedहमेशा बाइनरी डेटा को संभाल सकते हैं, एक मध्यस्थ बाइट को तीन 7BITबाइट्स में बदलने के सरल समीक्षक द्वारा । अक्षम, लेकिन यह काम करता है (और ध्यान दें कि फाइलनाम के साथ-साथ बाइनरी डेटा को भेजने में सक्षम नहीं होने के बारे में टिप्पणी गलत है; आप बस इसे एक अन्य कुंजी / मूल्य जोड़ी के रूप में भेजें)।
इसके साथ समस्या multipart/form-dataयह है कि सीमा विभाजक फ़ाइल डेटा में मौजूद नहीं होना चाहिए (देखें RFC 2388 ; धारा 5.2 में उचित समुच्चय MIME प्रकार नहीं है, जो इस समस्या से बचा जाता है) के लिए एक लंगड़ा बहाना भी शामिल है।
तो, पहली नजर में, किसी भी फ़ाइल अपलोड, बाइनरी या अन्यथा multipart/form-dataमें कोई मूल्य नहीं है । आपने अपनी सीमा को नहीं चुनते हैं, तो आप करेंगे अंत में एक समस्या है, तो आप सादा पाठ या कच्चे द्विआधारी भेज रहे हैं कि क्या - सर्वर गलत जगह पर एक सीमा मिलेगा, और अपनी फ़ाइल छोटा कर दिया जाएगा, या पोस्ट असफल हो जायेगी।
कुंजी एक एन्कोडिंग और एक सीमा को चुनना है जैसे कि आपके चयनित सीमा वर्ण एन्कोडेड आउटपुट में प्रकट नहीं हो सकते। उपयोग करने के लिए एक सरल उपाय है base64( कच्चे बाइनरी का उपयोग न करें)। में बेस 64 3 मनमाना बाइट्स चार 7 बिट वर्ण, जहां उत्पादन वर्ण सेट है में इनकोड [A-Za-z0-9+/=](यानी अक्षर या अंक, '+', '/' या '=')। =एक विशेष मामला है, और केवल एक =या दो के रूप में एन्कोडेड आउटपुट के अंत में दिखाई दे सकता है ==। अब, अपनी सीमा को 7-बिट ASCII स्ट्रिंग के रूप में चुनें जो base64आउटपुट में प्रकट नहीं हो सकता है । नेट पर आपके द्वारा देखे जाने वाले कई विकल्प इस परीक्षा में विफल हो जाते हैं - MDN डॉक्स बनाता है, उदाहरण के लिए, बाइनरी डेटा भेजते समय एक सीमा के रूप में "बूँद" का उपयोग करें - अच्छा नहीं। हालांकि, "बूँद!" base64आउटपुट में कभी नहीं दिखाई देगा ।