2008-11-11 149 views
11

將文件上傳到服務器時,Web瀏覽器是否將http頭中的文件大小發送出去?如果是這種情況,那麼是否可以通過閱讀標題來拒絕文件,而不是等待整個上傳過程完成?上傳文件的大小

回答

11

http://www.faqs.org/rfcs/rfc1867.html

HTTP客戶端 鼓勵提供內容長度的整體文件的輸入,這樣,如果所提出的文件數據太大,無法 處理合理

一個 繁忙的服務器可以檢測

但內容長度不是必需的,所以你不能依賴它。另外,攻擊者可能僞造錯誤的內容長度。

閱讀文件內容是唯一可靠的方法。話雖如此,如果content-lenght存在並且太大,關閉連接將是一件合理的事情。

此外,內容以多部分形式發送,所以大多數現代框架都先解碼。這意味着在框架完成之前你不會得到文件字節流,這可能意味着「直到整個文件被上傳」。

1
  1. 我不知道,但你真的不應該信任標頭中發送任何東西,因爲它可以由用戶來僞造。

  2. 這取決於服務器的工作方式。例如在PHP中,你的腳本不會運行,直到文件上傳完成,所以這是不可能的。

2

編輯:之前太過分了,你可能想檢查這個依賴於Apache配置的其他答案:Using jQuery, Restricting File Size Before Uploading。以下說明僅在您需要更多自定義反饋時纔有用。

是的,您可以在允許上傳整個文件之前預先獲得一些信息。

這裏的頭從一種形式來與enctype="multipart/form-data"屬性的例子:

POST/HTTP/1.1 
Host: 127.0.0.1:8000 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961 
Content-Length: 135361 

-----------------------------886261531333586100294758961 
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg" 
Content-Type: image/jpeg 

(data starts here and ends with -----------------------------886261531333586100294758961) 

你必須在頭中的內容長度,另外還有就是內容類型的文件部分的標題(每個文件都有自己的頭,這是多部分編碼的目的)。請注意,通過猜測文件類型來設置相關的Content-Type是瀏覽器的責任;你不能保證它,但它應該是相當可靠的早期拒絕(但你最好檢查整個文件,當它是完全可用的)。

現在,有一個問題。我曾經像這樣過濾圖像文件,不是大小,而是內容類型;但是如果您想盡快停止請求,則會出現同樣的問題:瀏覽器在發送完整請求後纔會收到您的回覆,其中包括表單內容以及上傳文件

如果你不想提供的內容並停止上傳,你別無選擇,只能粗暴地關閉套接字。用戶只會看到一個令人困惑的「由對等方重置連接」消息。這很糟糕,但它是有設計的。

所以你只想在後臺異步檢查的情況下使用這種方法(使用檢查文件字段的計時器)。所以我有這樣的黑客:

  • 我使用jQuery來告訴我,如果該文件中的字段已經改變
  • 當選擇一個新的文件,禁用相同的形式上的所有其他文件字段只得到一個。
  • 將文件發送異步(jQuery的可以爲你做它,它使用一個隱藏幀)
  • 服務器端,檢查頭(內容長度,內容類型,...),一旦切斷連接因爲你有你需要的東西。
  • 設置一個會話變量,告訴該文件是否正確。
  • 客戶端,因爲文件上傳到一個框架如果連接關閉甚至沒有任何反饋。你唯一的選擇是計時器。
  • 客戶端,定時器輪詢服務器以獲取上傳文件的狀態。服務器端,你有該會話變量集,將其發送回瀏覽器。
  • 客戶端有狀態碼;呈現給你的表單:錯誤信息,綠色複選標記/紅色X,無論如何。重置文件字段或禁用表單,您決定。不要忘記重新啓用其他文件字段。

很亂,呃?如果你們中的任何一個人有更好的選擇,我全都是耳朵。