2011-06-02 17 views
42

के साथ फ़ाइल अपलोड करें हाय मैं इस कोड के साथ xmlhttprequest के साथ फ़ाइल भेजने की कोशिश कर रहा हूं।अजाक्स XmlHttpRequest

<script> 
    var url= "http://localhost:80/...."; 
    $(document).ready(function(){ 
     document.getElementById('upload').addEventListener('change', function(e) { 
      var file = this.files[0]; 
      var xhr = new XMLHttpRequest(); 
      xhr.file = file; // not necessary if you create scopes like this 
      xhr.addEventListener('progress', function(e) { 
       var done = e.position || e.loaded, total = e.totalSize || e.total; 
       console.log('xhr progress: ' + (Math.floor(done/total*1000)/10) + '%'); 
      }, false); 
      if (xhr.upload) { 
       xhr.upload.onprogress = function(e) { 
        var done = e.position || e.loaded, total = e.totalSize || e.total; 
        console.log('xhr.upload progress: ' + done + '/' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%'); 
       }; 
      } 
      xhr.onreadystatechange = function(e) { 
       if (4 == this.readyState) { 
        console.log(['xhr upload complete', e]); 
       } 
      }; 
      xhr.open('post', url, true); 
      xhr.setRequestHeader("Content-Type","multipart/form-data"); 
      xhr.send(file); 
     }, false); 
    }); 
</script> 

लेकिन मैं यह त्रुटि आई: क्योंकि कोई बहुखण्डीय सीमा मिला था मेरी मदद कृपया अनुरोध अस्वीकार कर दिया था ..

उत्तर

77
  1. xhr.file = file; जैसी कोई चीज नहीं है; फ़ाइल ऑब्जेक्ट को इस तरह से संलग्न नहीं किया जाना चाहिए।
  2. xhr.send(file) फ़ाइल नहीं भेजता है। (यदि आप PHP का उपयोग कर रहे हैं)

    var formData = new FormData(); 
    formData.append("thefile", file); 
    xhr.send(formData); 
    

उसके बाद, फ़ाइल $_FILES['thefile'] में पहुँच हो सकता है: आप FormData वस्तु का उपयोग करने के लिए एक multipart/form-data पद डेटा वस्तु में फ़ाइल रैप करने के लिए किया है।

याद रखें, MDC और Mozilla Hack demos आपके सबसे अच्छे दोस्त हैं।

EDIT: उपरोक्त (2) गलत था। यह फ़ाइल भेजता है, लेकिन यह इसे कच्चे पोस्ट डेटा के रूप में भेज देगा। इसका मतलब है कि आपको इसे स्वयं सर्वर पर पार्स करना होगा (और यह अक्सर संभव नहीं है, सर्वर कॉन्फ़िगरेशन पर निर्भर करता है)। PHP here में कच्चे पोस्ट डेटा को कैसे प्राप्त करें पढ़ें।

+1

इतनी ज्यादा मेरी मदद की .. –

+5

xhr.send (फ़ाइल) XHR2 पर आधारित है जो कुछ ब्राउज़रों में केवल XMLHttpRequest ऑब्जेक्ट का एक नया संस्करण है। – nkassis

+1

@nkassis हाँ, लेकिन यह सर्वर को पार्स करने के लिए एक मल्टीपार्ट पोस्टडेटा बनाने के बजाय फ़ाइल को पोस्ट बॉडी के रूप में भेज देगा। – timdream