Web服务器可以在客户端发送完整请求之前开始响应吗?

我正在为一个学术研究小组编写一个Web应用程序。 研究人员需要能够以CSV格式上传大型数据集(100MB – 1GB)。 我已经编写了服务器来处理数据。这意味着如果在CSV的第一行出现错误,我们可以立即返回一个错误。

但是,如果发生这种情况,浏览器会报告“连接已重置”或类似情况。 很明显,我的网络服务器的响应方式是没有意义的。

如果在将错误返回给浏览器之前,我明确地关闭了HTTP请求流(这是JVM上的Kotlin),那么问题就会消失。 然而,事实certificate,请求流的紧密实现首先进行,并将整个流读取到最后。 那么在这一点上,用户仍然需要等30分钟才能发现他们的CSV的第一行有错误。

我正在尝试做什么? 在任何情况下,HTTP协议是否允许Web服务器在完整的请求主体发送之前开始响应? 如果没有,你能否提出一个解决方法,让我提供一个用户体验,在用户不需要等待整个文件上传之前,发现是否有任何问题?

答案是肯定的,根据HTTP规范服务器应该能够提前发送响应,客户端应该停止发送请求体。 但是,大多数浏览器都没有正确实现。

理论上,你的http服务器需要返回一个4xx错误代码和一个响应主体,然后重置连接以防止上传在后台继续。 有关该问题的更详细说明,请参阅下面的答案。 有几个浏览器版本支持这个function,所以如果你在实验室条件下这样做,你可以控制使用的客户端,下面的链接将有所帮助。

https://stackoverflow.com/a/14483857/2274303

https://stackoverflow.com/a/18370751/2274303

[编辑]

若要回答有关使用变通方法的问题,请使用javascript分块上传是缓解互联网连接问题的好方法,但是如果您想实时解析它,则不像将文件分解为碎片那样简单。 您需要确保您不会将文件分割成一行,否则即使数据有效也会失败。 这就提出了在javascript中解析1GB文件的问题,这不是一个好主意。

如果你想使用JavaScript,请通过ajax请求一次性上传整个文件,这样你就可以在主DOM之外获得响应,并强制重定向或取消上传。 根据你使用的js库有不同的方法。

这些都不能解决相反的情况。 如果在出现错误之前文件上传了95%,该怎么办? 研究人员需要重新上传整个文件,或者编辑文件,只包含前进错误中的行。 这意味着您的应用程序需要支持部分上传,并知道从哪里停止。 所有这些都是可能的,但是你可能不会find一个简单的解决方法来使这个工作很好。

如果不了解数据集以及您正在进行哪种validation,则很难提出完整的解决方案。 如果解析每一行并不依赖于以前的行是有效的,你总是可以上传整个文件,然后显示最后有错误的行,并要求他们上传第二个文件只是更正。

HTTP Web服务器的正常处理过程如下所示:

Server listens for request Client creates request Client sends request to server Server processes request Server creates response Server sends response to client Client processes response 

客户端启动连接进行通信,服务器能够在该连接上进行响应,但是如果关闭连接,服务器将需要在另一个连接上发送响应。 浏览器可能不允许服务器启动客户端未请求的新连接。

您可以通过阅读第一行并快速创建错误来做出响应,但客户端在发送请求之前不会读取响应。

通过发送文件块或异步发送文件的行,您将能够立即提供反馈。 您将发送许多较小的请求,并具有在这两者之间进行响应的能力。

问题是关于HTTP协议。 如果你写了一个自定义的应用程序和Web应用程序,我觉得这样做会被协议所允许,但是如果你使用的是浏览器,那么你必须使用HTTP,因为公司已经实现了它。 在一个自定义的应用程序中,你可以检查中断,然而大多数浏览器可能会在听到响应之前触发一个完整的请求,这也是AJAX在20年前起飞的原因。