2010-05-28 55 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示例。

相關問題