【发布时间】: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.loaded的event.total?progress事件分派传输的字节,但不会监控通过网络发送的字节。 -
我从网络流量监视器和 chrome 开发工具中知道。发生的情况是:进度在 4/5 秒内达到 100℅(有时它从 60℅ 以上开始,这没有意义,网络怎么传输这么快?),流量监控器说上传正在进行 12 chrome 开发工具将请求报告为“待处理”的几秒钟后,最终响应到达并且网络流量也变为 0。
-
是的,
progress事件大约每 50 毫秒调度一次。progress事件未实时调度 "如果自上次调用这些子子步骤后未经过大约 50 毫秒,则终止这些子子步骤。" , "如果设置了上传侦听器标志,则触发XMLHttpRequestUpload对象上名为 progress 的进度事件,其中包含请求正文的传输字节数和请求正文的总字节数。" xhr.spec.whatwg.org/#xmlhttprequestupload .
标签: javascript file upload xmlhttprequest progress