代码之家  ›  专栏  ›  技术社区  ›  vartec

在完成后上载之前重定向

  •  20
  • vartec  · 技术社区  · 14 年前

    我有带文件上传的表格。要上传的文件实际上是图片和视频,所以它们可能很大。我有一个基于头和前1KB的逻辑,它可以确定其余的部分是被处理还是立即被拒绝。在以后的情况下,我希望将客户机重定向到错误页面,而不必等待上载完成。

    事实是,仅仅在发布完成之前发送响应似乎不起作用。重定向被忽略,如果我关闭连接,浏览器会抱怨 “对等端重置连接” 错误。

    因此,问题是:在纯HTTP(客户端没有javascript)中是否甚至可以这样做?如果可以,如何做?

    3 回复  |  直到 14 年前
        1
  •  15
  •   SpliFF    14 年前

    HTTP/1.1协议确实允许这样做,只是以一种非常奇怪和混乱的方式。您需要应用以下三个步骤:

    1. 立即(突然)关闭连接,存储客户端会话的服务器端标志
    2. 使用该标志检测重新发送同一表单数据的尝试,规范建议客户端自动执行此操作。
    3. 发送带有重定向的错误状态(如302临时移动)

    这个 应该 工作,因为如下面所述,在意外断开连接后,客户端将至少重试一次连接。在重试尝试时,应该只发送头,然后等待并监视错误响应,如果收到错误响应,则中止发送正文。

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

    8.2.4如果服务器过早关闭连接,客户端行为

    如果HTTP/1.1客户端发送请求 其中包括请求主体,但是 不包括预期 请求标题字段 “100继续”预期,如果 客户端未直接连接到 HTTP/1.1源服务器,如果 客户端看到连接关闭 在收到 服务器,客户端应重试 请求。如果客户端确实重试此操作 请求,它可以使用以下内容 “二元指数退避”算法 确保获得可靠的 回应:

      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 应该 做。谁知道什么浏览器 事实上 做 在这种情况下?不是我。您需要运行一些测试。
    2. 规范特别提到这种行为只适用于 如果客户端没有直接连接到HTTP/1.1源服务器 “。这似乎是一个非常奇怪的要求,实际上,这意味着您可能需要伪造服务器响应头来假装自己是代理服务器或HTTP/1.0服务器。
    3. 某些中间协议(如fast cgi)在请求完成之前可能无法激活脚本。在这种情况下,您实际上需要一个真正的低级套接字服务器。
    4. 整个过程是混乱和复杂的,甚至可能不起作用。在我看来,你最好使用Ajax。不过,你还是问过如果没有JS是否可以做到。
        2
  •  3
  •   Sam Dolan    14 年前

    看看张哥的票 #10850 - "Impossible to stop a large file upload mid-stream" . 这并不能解决问题,但至少能帮助你理解它。

        3
  •  -1
  •   openprojdevel    14 年前
    1. 如果使用apache,请使用pcel uploadprogress扩展
    2. 通过Ajax创建一个文件来轮询meta,并根据您的条件返回trueor false,您还可以获取临时文件并检查1KB meta。
    3. Ajax调用需要绑定一个函数,该函数使用HTML元刷新头重定向或保留,直到上载完成。


    签出uploadProgress示例。