2011-06-02 6 views
42

Merhaba, bu kod ile xmlhttprequest ile dosya göndermeye çalışıyorum.Dosya Yükleme Ajax ile 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> 

ama bu hata var: hayır çok parçalı sınır bulunamadığı için lütfen bana yardım isteği reddedildi ..

cevap

77
  1. xhr.file = file; diye bir şey yoktur; dosya nesnesinin bu şekilde eklenmemesi gerekiyor. Dosyayı göndermiyor
  2. xhr.send(file). Bir multipart/form-data sonrası veri nesnesine dosyayı kaydırmak için FormData nesneyi kullanmak zorunda:

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

Bundan sonra dosya $_FILES['thefile'] erişimi olabilir (PHP kullanıyorsanız).

Unutmayın, MDC ve Mozilla Hack demos en iyi arkadaşlar.

EDIT: Yukarıdaki (2) yanlıştı. Dosyayı gönderir, ancak ham posta verileri olarak gönderir. Bu, sunucu üzerinde kendiniz ayrıştırmanız gerektiği anlamına gelir (ve genellikle mümkün değil, sunucu yapılandırmasına bağlı olarak). PHP here'da ham posta verilerinin nasıl alınacağını okuyun.

+1

o kadar çok yardımcı oldu .. –

+5

xhr.send (dosya), bazı tarayıcılarda yalnızca XMLHttpRequest nesnesinin yeni bir sürümü olan XHR2'ye dayanmaktadır. – nkassis

+1

@ nkassis evet, ama ayrıştırmak için sunucu için çok parçalı bir postdata oluşturmak yerine dosyanın kendisini post gövdesi olarak gönderir. – timdream