2011-03-11 281 views
1

我目前正在從服務器上接收從客戶端上傳的圖像。客戶端可以通過http形式發送圖像,如下所示。通過http接收二進制數據

<form method="post" action="http://localhost:7074" enctype="multipart/form-data"> 
<input type="file" name="myfile"> 
<input type="submit"> 
</form> 

在我的服務器端,我遵循關於創建套接字和偵聽連接的beej教程。一旦從客戶端上傳的圖像,這是從緩衝區讀取我的服務器:

POST/HTTP/1.1 
Host: localhost:7074 
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------13305569846927610321194789130 
Content-Length: 3273 

-----------------------------13305569846927610321194789130 
Content-Disposition: form-data; name="myfile"; filename="0-adidas-logo.jpg" 
Content-Type: image/jpeg 

���� 

從接收到的數據,我推測,開始部分是HTTP頭和實際的二進制數據,我的形象是在「Content-Type:image/jpeg」之後。所以我打印了其餘的buf文件並保存爲jpeg文件,但是當我打開它時,出現錯誤「在狀態201中錯誤地調用jpeg庫。所以我想知道是否有任何問題我早先提到的,因爲我在這個階段打了一段時間的步驟。

+0

請添加代碼有人能幫你。 是否按照http頭中收到的Content-Length字段保存到文件中(通常文件不是一次全部發送,而是分成幾個包)? – 2011-03-11 13:14:03

+1

需要注意的一件事是HTTP標頭以\ r \ n結尾。確保你沒有將\ n或\ r \ n寫入jpeg。 – 2011-03-11 14:48:23

+2

我強烈建議你使用庫來做到這一點,而不是寫你自己的。 – Ben 2011-04-02 06:49:47

回答

0

引用您的HTTP響應,

的「表單數據」邊界頭端接一個\ r \ n 之後的數據就是你的二進制數據

二進制數據在下一次發生'邊界'時終止' - '

如:

-----------------------------13305569846927610321194789130-- 

的數據大小是從\ r \ n向邊界之前的最後一個字節的一切。

其他因素是郵政的http頭有一個內容大小。這是針對包含多部分部分的所有內容。

瞭解更多關於此處理表格數據(參見3.3節使用的multipart/form-data的的):

http://www.ietf.org/rfc/rfc1867.txt 

和內容處置

http://www.ietf.org/rfc/rfc2183.txt 
相關問題