当前位置: 首页 > 面试题库 >

XMLHttpRequest级别2-确定上传是否完成

东方国安
2023-03-14
问题内容

我正在使用ajax进行文件上传。文件上传后,php应该检查它(mime,大小,病毒(clamscan)等)-对于较大的文件,这需要花费几秒钟的时间。当文件上传时,<progress>正在填充HTML5
,当文件准备好并且PHP开始检查时,进度应该切换为不确定。我认为对的方式来做到这一点(这两者做 工作):

检查upload.onload事件

xhr.upload.addEventListener("load", function (e) {
    $("#uploadprogress").attr("value", false);
    $("#uploadprogress").attr("max", false);
    $("#progress").text("Checking file...");
});

这行不通,因为onload-event在请求准备就绪时触发,而不是在上传准备就绪时触发。

检查上传进度百分比是否= 100%

xhr.upload.addEventListener("progress", function (e) {
    if (e.lengthComputable && e) {
        p = (e.loaded / e.total);
        if (p==1) {
            $("#uploadprogress").attr("value", false);
            $("#uploadprogress").attr("max", false);
            $("#progress").text("Checking file...");
        } else {
            var percent = Math.ceil(p * 1000) / 10;
            $("#uploadprogress").val(e.loaded);
            $("#uploadprogress").attr("max", e.total);
            $("#progress").text("Uploading... " + percent + "%");
        }
   }
}
});

这是行不通的,因为上载百分比有时会停在大约 97%,尽管上传完成并且PHP开始处理文件

还有另一种可能性检查吗?


问题答案:

您要监听的事件readystatechange在XHR对象上(不在XHR.upload上)。readyState4当上载完成发送 ,并
在服务器关闭连接loadend/ load在上载完成时触发,无论服务器是否关闭连接。仅供参考,以下是您可以收听以及触发的事件:

    var xhr = new XMLHttpRequest();

    // ...
    // do stuff with xhr
    // ...

    xhr.upload.addEventListener('loadstart', function(e) {
      // When the request starts.
    });
    xhr.upload.addEventListener('progress', function(e) {
      // While sending and loading data.
    });
    xhr.upload.addEventListener('load', function(e) {
      // When the request has *successfully* completed.
      // Even if the server hasn't responded that it finished.
    });
    xhr.upload.addEventListener('loadend', function(e) {
      // When the request has completed (either in success or failure).
      // Just like 'load', even if the server hasn't 
      // responded that it finished processing the request.
    });
    xhr.upload.addEventListener('error', function(e) {
      // When the request has failed.
    });
    xhr.upload.addEventListener('abort', function(e) {
      // When the request has been aborted. 
      // For instance, by invoking the abort() method.
    });
    xhr.upload.addEventListener('timeout', function(e) {
      // When the author specified timeout has passed 
      // before the request could complete.
    });

    // notice that the event handler is on xhr and not xhr.upload
    xhr.addEventListener('readystatechange', function(e) {
      if( this.readyState === 4 ) {
        // the transfer has completed and the server closed the connection.
      }
    });


 类似资料:
  • 鉴于XHR 已经得到广泛接受,成为了事实标准,W3C 也着手制定相应的标准以规范其行为。 XMLHttpRequest 1 级只是把已有的XHR 对象的实现细节描述了出来。而XMLHttpRequest 2 级则进一步发展了XHR。并非所有浏览器都完整地实现了XMLHttpRequest 2 级规范,但所有浏览器都实现了它规定的部分内容。 21.2.1 FormData 现代Web 应用中频繁使用

  • 问题内容: 如果使用以下命令行参数将日志记录模块设置为DEBUG: 以后如何判断记录器是否设置为DEBUG?我正在编写一个装饰器,如果将True标志传递给它,它将为函数计时,如果没有给出标志,则默认情况下,当根记录器设置为DEBUG时,它会打印计时信息。 问题答案: 不带参数的将获取根级别记录器。 http://docs.python.org/library/logging.html#loggin

  • 问题内容: 到目前为止,我所看到的所有示例都涉及阻塞(通过运算符)获取结果。 我当前的方法涉及传递指向结构的指针: goroutine完成时会写的内容。然后,只要方便就可以进行检查。您有更好的选择吗? 我真正想要的是Qt风格的信号槽系统。我有一个预感,解决方案看起来几乎是微不足道的(有 很多 未开发的潜力),但是我对这种语言还不十分了解。 问题答案: 您可以使用“逗号,可以”模式(请参阅其页面上的

  • 问题内容: 嗨,我正在尝试使用此代码发送带有xmlhttprequest的文件。 但我收到此错误:请求被拒绝,因为未找到多部分边界,请帮助我。 问题答案: 没有这样的事情; 文件对象不应该以这种方式附加。 不发送文件。您必须使用对象将文件包装到post数据对象中: formData.append(“thefile”, file); xhr.send(formData); 之后,可以访问文件(如果您

  • 问题内容: 我知道有很多类似的问题,但是我仍然没有找到解决问题的方法。我正在尝试使用XMLHttpRequest上传文件,因此我开发了以下代码: PHP端脚本是: 但是var $ _FILES [‘file’]似乎为空,这意味着该文件未发送到服务器。然后,我决定在下面的代码中使用FormData对象 它可以正常工作,但文件大小只有8mb左右。当我尝试发送大小超过8mb的文件时,该var 再次变空

  • 问题内容: 我正在尝试确定给定类型()是否为可选类型,我正在使用此测试 但它始终返回false。 那么有什么办法可以做到这一点? 问题答案: 假设您要执行的操作是这样的: 可悲的是,swift当前(从Swift 2开始)不支持协方差和协变,并且不能直接针对类型进行类型检查: 一种替代方法是使特定协议扩展,并检查该类型: