XMLHttpRequest进度事件比实际上传快得多

10

我正在尝试实现一个上传表单,并使用xhr将上传状态返回给用户。一切似乎都已经正确实现了,然而,在上传时,回调函数似乎发生得太快了,并且返回的进度比实际发生的要高得多。

对于小于20MB的文件,我会立即收到一个回调,显示超过99%,但是上传仍会在后台继续一段时间。

请参见下面的截图,显示来自74MB文件的控制台。这是在上传初始化几秒钟后拍摄的,并且上传还持续了大约60秒(注意只有3个回调注册(已加载总大小)(计算百分比),以及带有指示器的ajax上传继续进行)。

有人经历过这种情况并成功获得了上传状态的准确表示吗?

(“load”事件在上传过程之后正确触发)

这是我的代码:

$(this).ajaxSubmit({
    target: '#output',
    beforeSubmit:  showRequest,
    xhr: function()
    {
        myXhr = $.ajaxSettings.xhr();
        if (myXhr.upload)
        {
            console.log('have xhr');
            myXhr.upload.addEventListener('progress', function(ev){
                if (ev.lengthComputable) {
                    console.log(ev.loaded + " " + ev.total);
                    console.log((ev.loaded / ev.total) * 100 + "%");
                }
            }, false);

        }
        return myXhr;
    },
    dataType: 'json',
    success:  afterSuccess
});

在这里输入图像描述


3
听起来可能有些奇怪,但是你有没有安装任何杀毒软件?如果安装了,当你关闭杀毒软件时是否观察到相同的行为? - raina77ow
根据你的建议,我刚刚在我的家用电脑上(Mac,没有杀毒软件)第一次尝试了一下,结果非常顺利!之前我一直在工作电脑上进行开发。我会尝试在工作电脑上禁用杀毒软件,看看是否有任何影响。非常感谢你的提醒! - Fraser
@raina77ow 看起来是防病毒软件造成的问题。我在我的工作机器上禁用了它,现在它运行得非常好。谢谢你。请在下面回答并我会释放赏金。 - Fraser
2个回答

7

有几份报告都显示了同样的情况——文件上传时进度报告不正确,这是由于杀毒软件在检查要上传的文件。我猜测是杀毒软件的某个部分试图弥补可能由检查引起的延迟,但未能做到很好。


遇到了同样的问题,这个解决了。但是希望我能尽快找到一个解决方法。 - Wayne Pincence

1

最近我也遇到了同样的问题。我认为你的ajax调用是在文件上传之前就已经返回了。为了解决这个问题,可以加载你上传的内容并检查load事件。例如,如果你正在上传图片(使用jQuery):

var loadCheck = $('<img src="' + uploadedUrl +'">').hide().appendTo('body');
loadCheck.on('load', updateProgressBar());

当然,您可以在其他类型文件上实现它,并结合使用$.each迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接