Javascript 如何正确编写http响应以便使用XHR进度事件侦听器

Javascript 如何正确编写http响应以便使用XHR进度事件侦听器,javascript,http,http-headers,xmlhttprequest,httpresponse,Javascript,Http,Http Headers,Xmlhttprequest,Httpresponse,我想使用XHR对象的“进度”事件来获取下载进度 下面是来自 我编写了类似的代码,但progress事件的lengthComputeable字段结果为false。加载的字段是某个有限值,但总计设置为零 从上面代码示例中的注释可以看出,浏览器在HTTP响应中没有获得足够的信息来计算有意义的下载进度 写响应的正确方法是什么?我在测试中看到的响应有传输编码:chunked和内容长度:8。我是从Tornado Web服务器生成的。在中,响应的总长度不是由服务器指示的,因此客户端事先不知道 你可以尝试两件事

我想使用XHR对象的“进度”事件来获取下载进度

下面是来自

我编写了类似的代码,但progress事件的
lengthComputeable
字段结果为false。加载的
字段是某个有限值,但
总计
设置为零

从上面代码示例中的注释可以看出,浏览器在HTTP响应中没有获得足够的信息来计算有意义的下载进度

写响应的正确方法是什么?我在测试中看到的响应有
传输编码:chunked
内容长度:8
。我是从Tornado Web服务器生成的。

在中,响应的总长度不是由服务器指示的,因此客户端事先不知道

你可以尝试两件事

  • 使用
    内容长度
    禁用分块传输编码以支持正常方法。这就是进度事件规范的内容。但我不知道这是否/如何可能与龙卷风有关
  • 或者,在自定义响应头中包括总长度,如
    X-total-length
    。然后,使用如下代码确定您的百分比:

    function updateProgress(evt) {
      var total = evt.lengthComputable ?
                  evt.total : parseInt(req.getResponseHeader('X-Total-Length'));
      if (total) {
        var percentComplete = evt.loaded / total;
        // ...
      }
    }
    
在中,响应的总长度不是由服务器指示的,因此客户端事先不知道

你可以尝试两件事

  • 使用
    内容长度
    禁用分块传输编码以支持正常方法。这就是进度事件规范的内容。但我不知道这是否/如何可能与龙卷风有关
  • 或者,在自定义响应头中包括总长度,如
    X-total-length
    。然后,使用如下代码确定您的百分比:

    function updateProgress(evt) {
      var total = evt.lengthComputable ?
                  evt.total : parseInt(req.getResponseHeader('X-Total-Length'));
      if (total) {
        var percentComplete = evt.loaded / total;
        // ...
      }
    }
    

第二个技巧有点奏效。我需要这样做是因为gzip压缩。gzip始终使LengthComputeable==false,内容长度标头对于压缩大小是正确的,并允许加载页面。我必须估计压缩水平,并相应地调整总数。希望有更好的方法做到这一点。第二个技巧有点奏效。我需要这样做是因为gzip压缩。gzip始终使LengthComputeable==false,内容长度标头对于压缩大小是正确的,并允许加载页面。我必须估计压缩水平,并相应地调整总数。希望有更好的方法做到这一点。