2015-12-09 23 views
2

正如標題所說,我需要獲取發佈爲multipart/form-data請求的文件的真實文件大小。如何在多部分/表單數據請求中獲取文件的實際文件大小

我基於JSF世界,但我認爲問題是技術不可知的(僅取決於HTTP)。

Content-Length標頭中指定的值是不夠的,因爲它包含邊界和其他表單參數。

實施例請求(僅機身):

-----------------------------355432893771247592819421210 
Content-Disposition: form-data; name="composeform" 

composeform 
-----------------------------355432893771247592819421210 

Content-Disposition: form-data; name="javax.faces.ViewState" 

-9107117821100047188:3613431652649065231 
-----------------------------355432893771247592819421210 
Content-Disposition: form-data; name="file"; filename="3byte.txt" 
Content-Type: text/plain 

abc 

-----------------------------355432893771247592819421210-- 

請求體的最後部分包含文件,在這種情況下,命名爲「3byte.txt」包含字符「ABC」的文件。

正如你可以看到,文件大小不包括在該請求,因此,我見得到的價值的唯一途徑,是一種基於內容長度標題和邊界的大小來計算的話和其他表單參數。

附加要求:

  • 解決方案不應該讀/解析整個請求來獲取文件大小(這顯然很容易)
  • 有可能在多個表單參數要求,之前和/或

類似的問題,不解決這個問題包含文件(相對於我的例子)之後的部分:

回答

2
  1. 可以想到的是,Content-Length頭被設置爲multipart消息(一些多部分請求類型甚至禁止內容長度報頭)。僅需要或者 a Content-Length標頭 a Transfer-Encoding標頭存在。

  2. 多部分消息的一部分中不能有Content-Length標頭。

然而,你的發送者可以設置在配置報頭的附加參數。您可以利用此功能來設置文件大小如下:

Content-Disposition: form-data; name="file"; filename="3byte.txt"; size=123 

但是這將是純粹是可選的,該參數的名稱將是任意的,沒有寄件人需要包括此參數。這意味着,HTTP服務器引擎永遠不能依賴它。

+0

它看起來確實沒有標準的解決方案,因此我現在接受這個答案。 – unwichtich

相關問題