我使用文件上傳形式。要上傳的文件實際上是圖片和視頻,因此它們可能相當大。我有基於標題和第一個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