一个小的 HTTP 后端是用 Qt C++ 编写的。该网页通过 AJAX 上传文件(FormData()通过 JS 使用):
let file = this.files[0];
let formData = new FormData();
formData.append('file', file);
let xhr = new XMLHttpRequest();
xhr.open("POST", '/url', true);
xhr.send(formData);
xhr.onload = function() {
...
}
xhr.onerror = function() {
...
}
本地测试进展顺利:整个文件都上传到服务器。但是,在用户 ping > 500ms 的实际条件下进行测试时,只有小文件(最大 100KB)被成功下载,其余的并没有完全下载。也就是说,用户的套接字已关闭,但仅从中检索到文件的一部分(通常是初始部分)。我试图通过尝试发送文件来捕获来自客户端的重复请求,但根本没有这样的请求。结果客户端大惊小怪,不再尝试做任何事情,而服务器实际上是垃圾。
问题:网络服务器如何处理慢速连接,允许您在与用户的网络浏览器的连接不断断开时下载大文件,如果他由于连接错误再次发送 - 一次尝试再次发送文件?谷歌搜索一些关于不完整文件的专门 HTTP 服务器响应没有给出任何结果,并且通常没有对文件上传的信息响应,只有标头 403、200 等。
明显的错误是在读取循环中,默认值为 30 秒,我将其设置为 0.5。有半秒钟,根本没有数据可读取,循环以不完整的文件结束。