दिलचस्प पोस्ट
एकाधिक स्क्रीन का समर्थन करने के लिए एप्लिकेशन कंकाल अजगर में fft मानों के साथ आवृत्ति को कैसे निकालना है धागा में थ्रेड स्टार्ट विधि के लिए पैरामीटर कैसे पारित करें? JQuery के साथ फॉन्ट-परिवार के आधार पर बॉडी फ़ॉन्ट-आकार बदलना MySQL केवल एक पंक्ति देता है gprolog: अपवाद के बाद एक स्टैकट्र्रेस प्राप्त करना जावास्क्रिप्ट ऑब्जेक्ट्स: पेरेंट प्राप्त करें मैक ओएस एक्स के तहत अपाचे 2 साइट फ़ाइलों / फ़ोल्डरों के लिए सही मालिक / समूह / अनुमतियाँ? दो सरणियों के डॉट उत्पाद से स्मृति बैंडविड्थ को मापना JTable हेडर छवि में क्यों नहीं दिखाई देता है? ऑब्जेक्ट सी # में जेनेरिक प्रकार का है अगर परीक्षण मैक्रोज तर्क पर Foreach मैक्रो रूबी 2.0.0 पी 0 आईआर चेतावनी: "डीएल नापसंद है, कृपया बेला का उपयोग करें" कोणीय- प्रपत्र: गतिशील रूप से उपयोगकर्ता क्लिक पर प्रपत्र फ़ील्ड जोड़ना स्लाइडर के तहत jQuery के यूआई स्लाइडर लेबल

File_get_contents का उपयोग करके एक फ़ाइल अपलोड करें

मुझे एहसास हुआ कि मैं कर्ल के साथ यह बहुत आसानी से कर सकता हूं, लेकिन मैं सोच रहा था कि क्या एक दूरस्थ वेब सर्वर पर फाइल अपलोड करने के लिए http stream संदर्भ के साथ file_get_contents() का उपयोग करना संभव है, और यदि ऐसा है, तो कैसे?

वेब के समाधान से एकत्रित समाधान "File_get_contents का उपयोग करके एक फ़ाइल अपलोड करें"

सबसे पहले, multipart कंटेंट-टाइप का पहला नियम सीमा को परिभाषित करना है जो प्रत्येक भाग के बीच सीमांकक के रूप में इस्तेमाल किया जाएगा (क्योंकि नाम कहता है, इसमें कई भाग हो सकते हैं)। सीमा किसी भी स्ट्रिंग हो सकती है जो सामग्री बॉडी में शामिल नहीं है । मैं आमतौर पर एक टाइमस्टैम्प का उपयोग करूँगा:

 define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true)); 

एक बार आपकी सीमा परिभाषित हो जाने के बाद, आपको वेबसर्वर को यह बताकर Content-Type हैडर भेजना होगा कि क्या सीमांकक अपेक्षा करता है:

 $header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY; 

एक बार ऐसा किया जाने के बाद, आपको एक उचित सामग्री बॉडी बनाना चाहिए जो HTTP विनिर्देश और आपके द्वारा भेजे गए हेडर से मेल खाता हो। जैसा कि आप जानते हैं, एक फॉर्म से एक फ़ाइल पोस्ट करते समय, आपके पास आमतौर पर एक फॉर्म फ़ील्ड नाम होगा। हम इसे परिभाषित करेंगे:

 // equivalent to <input type="file" name="uploaded_file"/> define('FORM_FIELD', 'uploaded_file'); 

फिर हम सामग्री के शरीर का निर्माण करते हैं:

 $filename = "/path/to/uploaded/file.zip"; $file_contents = file_get_contents($filename); $content = "--".MULTIPART_BOUNDARY."\r\n". "Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"".basename($filename)."\"\r\n". "Content-Type: application/zip\r\n\r\n". $file_contents."\r\n"; // add some POST fields to the request too: $_POST['foo'] = 'bar' $content .= "--".MULTIPART_BOUNDARY."\r\n". "Content-Disposition: form-data; name=\"foo\"\r\n\r\n". "bar\r\n"; // signal end of request (note the trailing "--") $content .= "--".MULTIPART_BOUNDARY."--\r\n"; 

जैसा कि आप देख सकते हैं, हम name पैरामीटर (फ़ॉर्म फ़ील्ड नाम) और filename पैरामीटर (मूल फ़ाइल नाम) के साथ form-data साथ form-data स्वभाव के साथ Content-Disposition हेडर भेज रहे हैं। यदि आप सही तरीके से $_FILES[]['type'] पॉप्युलेट करना चाहते हैं तो उचित MIME प्रकार के साथ Content-Type हैडर भेजने के लिए भी महत्वपूर्ण है

यदि आपके पास अपलोड करने के लिए एकाधिक फ़ाइलें थी, तो आप केवल $ सामग्री बिट के साथ प्रक्रिया दोहराते हैं, निश्चित रूप से, प्रत्येक फ़ाइल के लिए एक अलग FORM_FIELD

अब, संदर्भ का निर्माण:

 $context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => $header, 'content' => $content, ) )); 

और निष्पादित करें:

 file_get_contents('http://url/to/upload/handler', false, $context); 

नोट: इसे भेजने से पहले अपनी बाइनरी फाइल को सांकेतिक शब्दों में बदलना करने की कोई आवश्यकता नहीं है। HTTP बाइनरी को ठीक से ठीक कर सकता है

आप Content-Type: multipart/form-data साथ एक POST अनुरोध जारी कर सकते हैं Content-Type: multipart/form-data हेडर और Content-Type: multipart/form-data रूप में मैन्युअल रूप से आपकी फ़ाइल को एन्कोड कर सकते हैं।

 file_get_contents(URL, false, stream_context_create(array( 'http' => array( 'method' => 'POST', 'headers' => 'Content-Type: multipart/form-data' 'content' => MULTIPART_ENCODED_FILE, ), )));