2012-09-10 35 views
6

में लापता सीमा मैं XMLHttprequest के साथ एक फ़ाइल अपलोड कर रहा हूं।XMLHttprequest के साथ एक फ़ाइल अपलोड करना - मल्टीपार्ट/फॉर्म-डेटा

var upload = function(file) { 
    // Create form data 
    var formData = new FormData(); 
    formData.append('file', file); 

    var xhr = new XMLHttpRequest(); 

    // Open 
    xhr.open('POST', this.options.action); 

    // Set headers 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
    xhr.setRequestHeader("X-File-Name", file.fileName); 
    xhr.setRequestHeader("X-File-Size", file.fileSize); 
    xhr.setRequestHeader("X-File-Type", file.type); 

    // Send 
    xhr.send(formData); 
} 

सर्वर साइड पर इस तरह से, upload.php में मैं फ़ाइल को पढ़ने:

file_put_contents($filename, (file_get_contents('php://input'))); 

सब कुछ ठीक काम करता है, सिवाय इसके कि यहाँ जे एस समारोह है, कि एक फ़ाइल अपलोड करता है मुझे एक PHP चेतावनी मिलती है:

Missing boundary in multipart/form-data POST data in Unknown on line 0

यदि मैं इस पंक्ति को हटा देता हूं: xhr.setRequestHeader("Content-Type", "multipart/form-data"); चेतावनी दूर हो जाती है।

यहां समस्या क्या होनी चाहिए?

+1

सामग्री प्रकार के रूप में 'एप्लिकेशन/एक्स-www-form-urlencoded' का उपयोग करने का प्रयास करें। या इसे छोड़ दें, क्योंकि यह एक AJAX अनुरोध द्वारा भेजा गया डिफ़ॉल्ट सामग्री-प्रकार है। –

+1

यह काम कर सकता है, लेकिन बड़ी फ़ाइलों (यहां तक ​​कि 5-600 केबी) के लिए ब्राउज़र फ्रीज हो जाएगा क्योंकि इसे फ़ाइल को "टेक्स्ट" प्रारूप में भेजना होगा। मुझे 'मल्टीपार्ट/फॉर्म डेटा' का उपयोग करना होगा। –

+2

क्षमा करें, फ़ाइल-अपलोड बिट को अनदेखा करें (पता नहीं कैसे), लेकिन [मुझे लगता है कि यह आपके queston का जवाब दे सकता है] (http://stackoverflow.com/questions/5933949/how-to-send-multipart-form- डेटा-फॉर्म-कंटेंट-बाय-एजेक्स-नो-जेक्वायरी), अधिक विशेष रूप से: 'xhr.setRequestHeader ("सामग्री-प्रकार", "मल्टीपार्ट/फॉर्म-डेटा; charset = utf-8; सीमा =" + Math.random () .toString()। substr (2)); 'चाल –

उत्तर

8

खैर यह मेरे लिए थोड़ा अजीब है, लेकिन यह क्या काम किया है:

// Open 
xhr.open('POST', this.options.action, true); 

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

इस मामले में, सर्वर साइड पर मैं php://input के माध्यम से भेजा फ़ाइल को पढ़ने नहीं है, लेकिन फ़ाइल में होगा $_FILES सरणी।

इससे मेरी समस्या हल हो गई, लेकिन मैं अभी भी उत्सुक हूं कि $_FILES में फ़ाइल क्यों दिखाई देती है?

क्रोम, मोज़िला, सफारी और आईई 10 में परीक्षण किया गया।

+8

[spec] (http://www.w3.org/TR/XMLHttpRequest/#the-send-method) बताता है (बिंदु 3) कि ब्राउज़र सही शीर्षलेख सेट करता है (सामग्री में सही मल्टीपार्ट सीमा संकेत सहित- टाइप करें) यदि आपने मैन्युअल रूप से कुछ भी निर्दिष्ट नहीं किया है। फ़ाइल '$ _FILES' में दिखाई देती है क्योंकि PHP [स्वचालित रूप से उस सुपरग्लोबल में मल्टीपार्ट फॉर्म अपलोड से फ़ाइलों को रखता है] (http://www.php.net/manual/en/features.file-upload.post-method.php)। – Gijs

+0

इसे समझने में मेरी सहायता करने के लिए धन्यवाद। –

+0

ने अकेले 'मल्टीपार्ट/फॉर्म-डेटा' को हटा दिया है। – ulab