我使用文件上传形式。要上传的文件实际上是图片和视频,因此它们可能相当大。我有基于标题和第一个1KB的逻辑可以确定其余的将被处理或立即被拒绝。在后面的情况下,我想将客户端重定向到错误页面,而不必等待上传完成。在POST上传之前重定向已完成
的情况是,POST之前刚刚发送响应完成似乎不工作。重定向被忽略,如果我关闭连接,浏览器会报告“由对等方重置连接”错误。
所以,问题是:是它甚至有可能做到这一点在纯HTTP(不使用JavaScript在客户端),如果是这样,怎么样?
我使用文件上传形式。要上传的文件实际上是图片和视频,因此它们可能相当大。我有基于标题和第一个1KB的逻辑可以确定其余的将被处理或立即被拒绝。在后面的情况下,我想将客户端重定向到错误页面,而不必等待上传完成。在POST上传之前重定向已完成
的情况是,POST之前刚刚发送响应完成似乎不工作。重定向被忽略,如果我关闭连接,浏览器会报告“由对等方重置连接”错误。
所以,问题是:是它甚至有可能做到这一点在纯HTTP(不使用JavaScript在客户端),如果是这样,怎么样?
的HTTP/1.1协议并允许这一点,只是在一个非常奇怪的和乱七八糟的方式。您需要应用以下3步proceedure:
这SHOULD工作,因为所概述的客户端下方有望重试CONNEC意外切断后至少一次。在重试尝试中,预计只发送头文件,然后等待并观察错误响应,如果有错误响应,则中止发送主体。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
8.2.4客户端行为如果服务器过早关闭连接
如果HTTP/1.1客户端发送请求 ,其包括请求的身体,但 ,其不包括期望 与 “100-继续”期望请求标头字段,并且如果 客户端不直接连接到 HTTP/1.1源服务器,并且如果客户端 瑟ES的连接从 服务器接收任何状态之前关闭 ,客户端应该重试 请求。如果客户端不重试此 请求时,它可以使用以下 “二进制指数退避”算法 放心获得可靠 响应:如果在任何时候出现的错误状态,接收
1. Initiate a new connection to the server 2. Transmit the request-headers 3. Initialize a variable R to the estimated round-trip time to the server (e.g., based on the time it took to establish the connection), or to a constant value of 5 seconds if the round- trip time is not available. 4. Compute T = R * (2**N), where N is the number of previous retries of this request. 5. Wait either for an error response from the server, or for T seconds (whichever comes first) 6. If no error response is received, after T seconds transmit the body of the request. 7. If client sees that the connection is closed prematurely, repeat from step 1 until the request is accepted, an error response is received, or the user becomes impatient and terminates the retry process.
,客户
- SHOULD NOT continue and - SHOULD close the connection if it has not completed sending the request message.
陷阱:
看一看Django的车票#10850 - "Impossible to stop a large file upload mid-stream"。没有解决问题,但至少它应该可以帮助你理解它。
据我所知,他们正在谈论停止服务器端的处理或重新设置连接,既不是我的好选择,因为它们都不允许立即重定向。 – vartec 2010-05-31 07:34:00
我认为这个bug报告至少可以回答你是否有可能用纯HTTP做这件事,但也许我只是不够聪明:)。 Javascript是不是一个选项,或者你只是试图避免使用它,如果你不必? – sdolan 2010-06-01 18:55:58
它需要在广泛的移动设备上工作,实际上不包括iPhone,BB和Android,它们可以获得原生应用程序。所以假设是,拥有JS并不能保证。 – vartec 2010-06-03 14:32:07
检出uploadprogress示例。
我必须说,这个答案相当有帮助。不过,我怀疑我甚至会试图实现这一点,因为我拥有的服务通常是无状态的,并且支持非粘性负载平衡器。 – vartec 2010-06-03 14:38:57