1. 程式人生 > >http Content-Type 中的boundary搗亂,導致服務端無法獲取上傳檔案

http Content-Type 中的boundary搗亂,導致服務端無法獲取上傳檔案

使用 httpcomponents httpclient 4.3.1 上傳檔案時服務端總是返回“需要可用的引數”,這個結果描述是應用自定義的,太過於籠統,得不到任何有用的資訊。後來和伺服器端一起除錯才找到問題的根源。

客戶端傳送的 http Content-Type:

Content-Type: multipart/form-data; boundary=rxU1IcP2kHsJVF37W5_8tRtSlAnB-KIhGP; charset=UTF-8

服務端C++應用呼叫Apache元件解析http header,獲取boundary,以boundary值為分隔符,解析request body獲取每個欄位。但客戶端傳送的Content-Type中boundary後面又跟上了charset設定,這兩部分中間以";"分隔。但是Apache在解析時好像基於這樣一個假設:Content-Type中boundary就是最後一部分內容,其後沒有任何其他設定。這樣它獲取的分隔符就是帶英文封號的,而客戶端傳送的request body中仍然是按照協議標準分隔的。

寫了一個簡單的Java服務端應用部署在tomcat中,它就可以正確獲取同一個客戶端的上傳檔案,可見是apache的實現有點小問題。

解決辦法:

MultipartEntityBuilder.create()
	//.setCharset(Consts.UTF_8)
	...

如上所示,註釋掉 setCharset 那一行客戶端傳送的 Content-Type 就沒有 "charset=UTF-8" 了,就可以正常上傳了。