【问题标题】:XMLHttpRequest wrong progressXMLHttpRequest 错误进度
【发布时间】:2017-07-19 20:43:22
【问题描述】:

我在使用 javascript 上传表单并监控其进度时遇到问题。

问题是 XMLHttpRequest 进度事件引发了一个奇怪的行为。实际上传未完成时达到100%太快了,有时刚启动,用chrome开发工具和系统监视器监控。

因此,虽然计算出的进度是 100%,但我等待发送文件的时间太长,而页面显然被卡住了。我读过防病毒软件可能是造成这种情况的原因,但事实并非如此。我没有防病毒软件,我也关闭了防火墙。我尝试在 windows 和 ubuntu 中使用 chrome、firefox 以及具有相同行为的 jquery 表单插件等库。

有人解释了这种奇怪的行为。 XMLHttpRequest 进度事件加载属性到底算什么?

提前谢谢你。我摔倒了一天。

这里有一小段代码用于重现问题:

<?php
echo "Hello!";

if(isset($_FILES['file'])){
    echo " File received";
    return;
}
?>

<form  method='post' action='' enctype='multipart/form-data'>
   <input type='file' name='file' />
   <input type='submit'>
</form>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<script>

$(document).ready(function(){
    $('form').submit(function(e){
        e.preventDefault();
        ajax = new XMLHttpRequest();
        ajax.onreadystatechange = function ()
        {
            console.log("READY STATE CHANGED");
            console.log(ajax);
        };

        ajax.upload.addEventListener("progress", function (event) {

            var percent = (event.loaded / event.total) * 100;
            console.log(percent);

        });

        ajax.open("POST", $(this).attr('action'), true);
        ajax.send(new FormData(this));
        return false;
    });

});
</script>

【问题讨论】:

  • 你期待什么结果?
  • 我希望在请求的最后一个字节发送到服务器时,进度百分比达到 100℅。相反,我看到 100℅,例如,在 5 秒内上传需要超过 10 秒才能完成
  • 不确定您的意思?字节仍然需要通过网络传输到服务器。你怎么知道这个过程需要 10 秒才能完成?您是否期望echo " File received"; 被调用为恰好等于event.loadedevent.totalprogress 事件分派传输的字节,但不会监控通过网络发送的字节。
  • 我从网络流量监视器和 chrome 开发工具中知道。发生的情况是:进度在 4/5 秒内达到 100℅(有时它从 60℅ 以上开始,这没有意义,网络怎么传输这么快?),流量监控器说上传正在进行 12 chrome 开发工具将请求报告为“待处理”的几秒钟后,最终响应到达并且网络流量也变为 0。
  • 是的,progress 事件大约每 50 毫秒调度一次。 progress 事件未实时调度 "如果自上次调用这些子子步骤后未经过大约 50 毫秒,则终止这些子子步骤。" , "如果设置了上传侦听器标志,则触发XMLHttpRequestUpload 对象上名为 progress 的进度事件,其中包含请求正文的传输字节数和请求正文的总字节数。" xhr.spec.whatwg.org/#xmlhttprequestupload .

标签: javascript file upload xmlhttprequest progress


【解决方案1】:

XMLHttpRequestUpload progress 事件大约每 50 毫秒调度一次。 XMLHttpRequestUpload 针对 body 传输的字节调度事件。据了解,XMLHttpRequestUpload 不会监控与body 传输字节相关的网络性能,也不会等待服务器的响应。

Make upload progress notifications

如果说要发出进度通知,则在下载过程中,排队一个任务以触发名为 progress 的进度事件,大约每 50 毫秒或接收到的每个字节,以最不频繁的为准。

如果说要让上传进度通知运行这些步骤:

  • 在上传请求实体正文和上传时 完成标志为假,将任务排队以触发名为的进度事件 progressXMLHttpRequestUpload 对象上大约每 50 毫秒或 传输的每个字节,以最少频率为准。

  • 如果request entity body 已成功上传且upload complete flag 仍为假,则排队运行这些任务 子步骤:

    1. 将上传完成标志设置为真。

    2. Fire a progress eventXMLHttpRequestUpload 对象上命名为load

    3. XMLHttpRequestUpload 对象上触发一个名为loadend 的进度事件。


另见How to read and echo file size of uploaded file being written at server in real time without blocking at both server and client?

【讨论】:

  • 这并不能解决实际问题。请参阅托比对这个问题的评论。这似乎是一个 Windows 错误。
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多