5
我需要訪問原始XMLHttpRequest
對象以在支持它的瀏覽器上添加文件上載進度回調。這是可能的,還是我必須自己構建原始請求?如果是這樣,我該如何將原始XMLHttpRequest
包裝在承諾對象中?
我需要訪問原始XMLHttpRequest
對象以在支持它的瀏覽器上添加文件上載進度回調。這是可能的,還是我必須自己構建原始請求?如果是這樣,我該如何將原始XMLHttpRequest
包裝在承諾對象中?
我模擬$http
調用構造定製XMLHttpRequest
像這樣:
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;
}
'getResponseHeader'不完全模仿正常響應提供'headers'功能。你也可能想把'xhr.response'改成'JSON.parse(xhr.response)',並且將'statusText'加入hash。 – 2015-07-14 08:58:12