我使用Dojo 1.10将文件上传到服务器。对于上传,我使用模块dojo / request / xhr并尝试以百分比显示进度。我很困惑,进程回调仅在传输结束时被触发。该文件已成功传输。请参阅我的代码片段:
function uploadFile(){
require([
'dojo/dom',
'dojo/request/xhr'
], function(dom, xhr) {
//... some unimportant code here
// Upload file now:
xhr(targetURL, {
handleAs: 'text',
method: 'POST',
headers: {'X-CSRF-Token': getAuthToken(), 'accept-charset': 'UTF-8'},
data: formData
}).then(function(data){
// Success => refresh file list
refreshDocList();
}, function(err){
// Failed
uploadFailed(err);
}, function(evt){
// Progress of upload
console.log(evt);
dom.byId('progress').innerHTML = 'Done ' + (evt.loaded * 100 / evt.total) + '%';
});
});
}
我在FireFox(45.0.1,Windows 8.1),Chrome(49.0.2623.110 m,Windows 8.1),MSIE(11.0.9600.18231,Windows 8.1),FireFox(44.0,Ubuntu 15.04),Chrome(48.0。 2564.116,Ubuntu 15.04)。在所提到的浏览器中,没有按预期调用进程回调。任何提示如何解决我的问题?
答案 0 :(得分:1)
在dojo / request中没有任何方式可以做到这一点。您需要直接使用XMLHttpRequest。
原因是只为下载部分发出了进度事件。对于上传部分,您需要使用XHR对象的上传成员,如下所示:
var oReq = new XMLHttpRequest();
oReq.upload.addEventListener("progress", updateProgress);
oReq.upload.addEventListener("load", transferComplete);
oReq.upload.addEventListener("error", transferFailed);
oReq.upload.addEventListener("abort", transferCanceled);
oReq.open();
查看dojo / request / xhr source code,我不认为有任何简单的方法可以获得dojo / request / xhr来公开XHR对象(并且通过扩展< strong>上传成员)。因此,您可能需要直接使用XMLHttpRequest。
有关详情,请参阅https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
答案 1 :(得分:0)
在@yassam的答案之后,似乎有一种方法可以访问xhr
幕后的dojo/request
对象,但是由于某些原因,我只能在通过时才能使它起作用true
作为request()
的第三个参数。这是returnDeferred
参数,如果您检查dojo/request/xhr
代码,则其最后一行:
return returnDeferred ? dfd : dfd.promise;
因此,您可以这样做:
var promise = request('some_url', { .. options .. }, true); // <-- note 'true'!
if (promise.response.xhr) {
promise.response.xhr.upload.addEventListener("progress", function (e) {
console.log('xhr progress: ' + e.loaded + ' of ' + e.total + ': ', e);
});
}
我目前不了解的一件事,将false
传递给returnDeferred
(或省略)应该返回dfd
,而不是dfd.promise
的{{1}} ,在这种情况下,您应该能够以完全相同的方式使用request()
,但我发现这并不存在。