2013-05-13 17 views
5

Potrzebuję uzyskać dostęp do surowego obiektu XMLHttpRequest, aby dodać wywołania zwrotne postępu przesyłania plików w przeglądarkach, które go obsługują. Czy to jest możliwe, czy też muszę sam je sformułować? Jeśli tak, jak zawinąć surowy obiekt XMLHttpRequest w obiekt obietnicy?

Odpowiedz

4

I symulowane rozmowy $http budowy zwyczaj XMLHttpRequest tak:

uploadFile(file, progressHandler) { 
    var xhr = new XMLHttpRequest(), 
     deferred = $q.defer(); 

    xhr.open("POST", "your/path", true); // method, url, async 
    xhr.setRequestHeader("Content-Type", file.type || "application/octet-stream"); 
    xhr.onreadystatechange = function (e) { 
    if (xhr.readyState == 4) { 
     $rootScope.$apply(function() { 
     // Construct a response object similar to a regular $http call 
     // 
     // data – {string|Object} – The response body transformed with the transform functions. 
     // status – {number} – HTTP status code of the response. 
     // headers – {function([headerName])} – Header getter function. 
     // config – {Object} – The configuration object that was used to generate the request. 
     var r = { 
      data: xhr.response, 
      status: xhr.status, 
      headers: xhr.getResponseHeader, 
      config: {} 
     }; 
     if (r.status == 200) { 
      deferred.resolve(r); 
     } else { 
      deferred.reject(r); 
     } 
     }); 
    } 
    }; 
    if (progressHandler && xhr.upload) { 
    xhr.upload.addEventListener('progress', function(e) { 
     progressHandler((e.loaded/e.total), e); 
    }, false); 
    } 
    // This is only available in XHR2, provide multipart fallback 
    // if necessary 
    xhr.send(file); 

    return deferred.promise; 
} 
+0

'getResponseHeader' nie doskonale imituje funkcję headers'' przewidziane w normalnej odpowiedzi. Możesz także zmienić 'xhr.response' na' JSON.parse (xhr.response) ', a także dodać' statusText' do skrótu. –

Powiązane problemy