Pourquoi XMLHttpRequest ProgressEvent.lengthComputable pourrait-il être faux?

Je suis en train de mettre en œuvre une barre de progression de téléchargement HTML5 façon, en utilisant XMLHttpRequest support de niveau 2 pour le progrès des événements.

Dans chaque exemple, vous voyez, la méthode consiste à ajouter un écouteur d'événement pour l'événement progress comme suit:

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

Ces exemples semblent toujours supposer que l'événement.lengthComputable sera vrai. Après tout, le navigateur sait la longueur de la demande, c'est de l'envoi, sûrement?

Peu importe ce que je fais, un événement.lengthComputable est faux. J'ai testé cela dans Safari 5.1.7 et Firefox 12, à la fois sur OSX.

Mon site est construit à l'aide de Django, et j'ai le même problème sur mon dev de production et de configurations.

Le code complet que j'utilise pour générer le formulaire de téléchargement est indiqué ci-dessous (à l'aide de 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;
});

J'ai déchiré mes cheveux pendant des heures sur ce. Toute aide appréciée!

source d'informationauteur Dave