1

文件上传完美,我无法让progessload事件回调

我在一个 JavaScript 文件中有以下内容作为我的 WebWorker 代码:

上传文件工作者.js

function uploadFile(url, m) {
    var f = m.file;
    var fd = new FormData();
    fd.append('file', f, f.name);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener('progress', function (e) {
        m.set('status', (e.loaded / e.total) * 100 );
        postMessage(m); // <-- never makes the call, doesn't throw and error either
    });
    xhr.upload.addEventListener('load', function (e) {
        m.set('status',100);
        postMessage(m); // <-- never makes the call, doesn't throw and error either
    });
    xhr.open('POST', url, true);
    xhr.send(fd);
}

function getUploadURL(m) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener('load', function () {
        var url = this.responseText;
        uploadFile(url,m);
    });
    xhr.open('GET', '/upload', false);
    xhr.send();
}

var q = [];

onmessage = function(e) {
    postMessage(e.data);
    q.push(e.data);
    while (q.length > 0) {
        var m = q.pop();
        getUploadURL(m);
    }
};

该函数完美运行postMessage(e.data);onmessage

回调postMessage(m);中的永远不会发生。xhr.upload.addEventListeners()在我尝试将这些函数移动到WebWorker代码中之前,它们运行良好。

这是范围问题吗? 如果是这样,我如何为调用添加前缀以使其正常工作。?

为了完整起见,这里是我定义我的实例Worker并开始它的方式。

onButtonClick: function(button, e, eOpts) {
    var ugv = this.getUploadGridView();
    var fs = this.getFileUploadStore();
    var worker = new Worker('/js/UploadFileWorker.js');
    worker.onmessage = function(e) {
        console.log(e);
    };

    var selected = ugv.getSelectionModel().getSelection();

    Ext.each(selected, function(m) {
        var o = {};
        o.name = m.get('name');
        o.size = m.get('size');
        o.status = m.get('status');
        o.file = m.file;
        worker.postMessage(o);
    });
},

同样,文件的实际上传效果很好,我不知道如何postMessage();从回调内部xhr调用。

4

1 回答 1

0

这显然是最近才修复的错误。

问题71433002:为 Worker 启用 XHR 上传进度事件。(关闭)

在 Chrome 更新之前的解决方法

xhr.addEventListener(

代替

xhr.upload.addEventListener(

这有一个缺点,即progress只为每个1MB小于1MB从未progress触发事件的文件调用。

于 2013-11-23T21:08:47.903 回答