2010-05-28 52 views
19

我使用文件上传形式。要上传的文件实际上是图片和视频,因此它们可能相当大。我有基于标题和第一个1KB的逻辑可以确定其余的将被处理或立即被拒绝。在后面的情况下,我想将客户端重定向到错误页面,而不必等待上传完成。在POST上传之前重定向已完成

的情况是,POST之前刚刚发送响应完成似乎不工作。重定向被忽略,如果我关闭连接,浏览器会报告“由对等方重置连接”错误。

所以,问题是:是它甚至有可能做到这一点在纯HTTP(不使用JavaScript在客户端),如果是这样,怎么样?

回答

14

的HTTP/1.1协议并允许这一点,只是在一个非常奇怪的和乱七八糟的方式。您需要应用以下3步proceedure:

  1. 立即(突然)关闭连接,存储在服务器端标志为客户端会话
  2. 使用标志来检测尝试新发送表单数据,该规范建议客户做这个自动
  3. 发送错误状态与一个重定向(如302暂时移动)

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. 

陷阱:

  1. 这就是规格说browswers SHOULD做。谁知道什么浏览器实际上做 在这种情况下?不是我。你需要运行一些测试。
  2. 该规范特别提到,如果客户端未直接连接到HTTP/1.1源服务器,此行为仅适用于“”。这似乎是一个非常奇怪的要求,在实践中意味着您可能需要假装您的服务器响应头来假装您是代理服务器或HTTP/1.0服务器。
  3. 某些中介协议如fast-cgi在请求完成之前可能不会激活您的脚本。在这种情况下,你实际上需要一个真正的低级套接字服务器。
  4. 这整个过程是混乱和令人费解,甚至可能不工作。在我看来,你最好使用AJAX。不过,你确实问过没有JS是否可以完成。如果你使用
+0

我必须说,这个答案相当有帮助。不过,我怀疑我甚至会试图实现这一点,因为我拥有的服务通常是无状态的,并且支持非粘性负载平衡器。 – vartec 2010-06-03 14:38:57

3

看一看Django的车票#10850 - "Impossible to stop a large file upload mid-stream"。没有解决问题,但至少它应该可以帮助你理解它。

+0

据我所知,他们正在谈论停止服务器端的处理或重新设置连接,既不是我的好选择,因为它们都不允许立即重定向。 – vartec 2010-05-31 07:34:00

+0

我认为这个bug报告至少可以回答你是否有可能用纯HTTP做这件事,但也许我只是不够聪明:)。 Javascript是不是一个选项,或者你只是试图避免使用它,如果你不必? – sdolan 2010-06-01 18:55:58

+0

它需要在广泛的移动设备上工作,实际上不包括iPhone,BB和Android,它们可以获得原生应用程序。所以假设是,拥有JS并不能保证。 – vartec 2010-06-03 14:32:07

-1
  1. 使用PCEL上传进度延期阿帕奇
  2. 创建一个文件轮询通过Ajax元,并返回根据您的病情trueor假的,你也可以得到temp_name文件,并检查了1KB元。
  3. ajax调用需要绑定一个函数,该函数使用HTML元刷新标题重定向或保持直到上传完成。


检出uploadprogress示例。

相关问题