我有一个基于http://www.dropzonejs.com/的上传器
当我使用Chrome上传大于3 MB(13 MB)的文件时,在控制台日志中收到ERR_SPDY_PING_FAILED
错误。
当我上传文件时,进度栏停留在某个级别。这是我们收到此错误的时间。
我在Safari和Firefox上尝试过,我们没有这个问题。
我搜索了一下,发现其他人也抱怨同样的问题。
这是来自Chrome的请求标头
Provisional headers are shown
Accept: application/json
Cache-Control: no-cache
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4sLYTyIwAAXnftvv
Origin: https://www.example.com
Referer: https://www.example.com/upload/document
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
X-Requested-With: XMLHttpRequest
------WebKitFormBoundary4sLYTyIwAAXnftvv
Content-Disposition: form-data; name="_token"
GiY0lmkggP4hlyhunGRQOOBa1k1dqsr44ZgHA41e
------WebKitFormBoundary4sLYTyIwAAXnftvv
Content-Disposition: form-data; name="file[0]"; filename="sdf_brz_lin.1.jpg"
Content-Type: image/jpeg
------WebKitFormBoundary4sLYTyIwAAXnftvv--
在此stackoverflow帖子中,他们提出了一些解决方案,但由于它们基于其他脚本,因此我无法实现它们的解决方案。
request stalled for a long time occasionally in chrome
他们提出了类似的建议
$(document).ready(function() {
$.keepalive =
setInterval(function() {
$.ajax({
url: '/ping.html',
cache: false
});
}, 60000);
});
但是我不知道如何将该解决方案集成到我的Dropzone中。
我不想说访客是否使用Chrome,您不能上传大于X MB的文件...
答案 0 :(得分:0)
就我而言,这是一个网络问题。因为如果我们将系统连接到IPV6网络,则会发生此问题。在ipV4上,上传就像魅力一样。
答案 1 :(得分:0)
我只是追踪了其中一个。这是由于上传目标服务器的 HTTP2 接收窗口设置太大造成的。
在客户端和服务器之间有足够多的代理或其他东西时,两个端点之间的总 TCP 缓冲区足以吞下上传的结尾,但直到很晚才完成传送。
浏览器厌倦了等待完成。当浏览器感到无聊时,它会变得偏执,并发送 HTTP2 PING 来检查连接是否仍然有效。 (鉴于它不断获得有关接收方实际接收到多少的 HTTP2 更新,这似乎是不必要的/一个错误!)
PING 进入与流量相同的多路复用 HTTP2 TCP 连接,并被困在那里,直到达到 PING 超时。客户端失去信心并终止连接,这无济于事,因为它实际上还活着!
通过将 HTTP2 接收窗口减少到一个合理的值,浏览器将不会被允许发送足够多的数据而导致巨大的流量拥堵。
如果您无法让服务器执行此操作,您可以使用浏览器 F12 网络诊断工具将上传速率限制为至多与链中最小带宽瓶颈相匹配的值- 无法形成交通拥堵,这意味着 PING 不会超时。
您可能会将此称为 Bufferbloat 问题的表现。