为什么XMLHttpRequest ProgressEvent.lengthComputable可能为false?

Dav*_*ave 13 javascript ajax xmlhttprequest

我正在尝试使用XMLHttpRequest 2级支持进度事件来实现HTML5方式的上传进度条.

在您看到的每个示例中,方法是向progress事件添加事件侦听器,如下所示:

req.addEventListener("progress", function(event) {
    if (event.lengthComputable) {
        var percentComplete = Math.round(event.loaded * 100 / event.total);
        console.log(percentComplete);
    }
}, false);
Run Code Online (Sandbox Code Playgroud)

这些示例似乎总是假设event.lengthComputable将为true.毕竟,浏览器肯定知道它发送的请求的长度?

无论我做什么,event.lengthComputable都是false.我已经在Safari 5.1.7和Firefox 12上测试了这两个,这两个都在OSX上.

我的网站是使用Django构建的,我在开发和生产设置上遇到了同样的问题.

我用来生成表单上传的完整代码如下所示(使用jQuery):

form.submit(function() {
    // Compile the data.
    var data = form.serializeArray();
    data.splice(0, 0, {
        name: "file",
        value: form.find("#id_file").get(0).files[0]
    });
    // Create the form data.
    var fd = new FormData();
    $.each(data, function(_, item) {
        fd.append(item.name, item.value);
    });
    // Submit the data.
    var req = new XMLHttpRequest();
    req.addEventListener("progress", function(event) {
        if (event.lengthComputable) {
            var percentComplete = Math.round(event.loaded * 100 / event.total);
            console.log(percentComplete);
        }
    }, false);
    req.addEventListener("load", function(event) {
        if (req.status == 200) {
            var data = $.parseJSON(event.target.responseText);
            if (data.success) {
                console.log("It worked!")
            } else {
                console.log("It failed!")
            }
        } else {
            console.log("It went really wrong!")
        }
    }, false);
    req.addEventListener("error", function() {
        console.log("It went really really wrong!")
    }, false);
    req.open("POST", "/my-bar/media/add/");
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    req.send(fd);
    // Don't really submit!
    return false;
});
Run Code Online (Sandbox Code Playgroud)

我已经把头发撕了好几个小时了.任何帮助赞赏!

est*_*est 35

嘿,我从@ComFreek 找到答案:

我犯了同样的错误.

我写的这句话是:

xhr.onprogress = uploadProgress;
Run Code Online (Sandbox Code Playgroud)

应该是正确的

xhr.upload.onprogress = uploadProgress;
Run Code Online (Sandbox Code Playgroud)