2014-09-23 93 views
2

目前,我嘗試在Windows下使用C++實現一個簡單的Web服務器。爲了支持文件上傳,我的代碼中實現了POST如何從POST請求的HTTP正文提取二進制文件內容?

現在,當一個二進制文件通過IE瀏覽器上傳時,兩個額外的字符0D0A被添加到文件的末尾。

上傳

enter image description here

文件內容上傳

enter image description here

這裏前後文件內容是一些代碼片段

// receive data from http socket 
char* orig_buf = buf; 
while ((cnt=recv(m_hSocket, buf, 1, 0)) > 0) 
{ 
    if(*buf++ == '\n') 
    { 
     *buf = '\0'; 
     buflen = buf - orig_buf; 
     return orig_buf; 
    } 
} 

// save buffer to binary file 
std::ofstream ofs(szFilename, std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); 
ofs.write(buf, buflen); 

通過Fiddler,我們發現0D 0A是通過網絡瀏覽器添加的。

enter image description here

在這個specs,我們知道文件行Boundary之前應該添加到結束。但是,第一個問題:如果文件內容和邊界之間沒有0D 0A會怎麼樣?因爲如果二進制文件的內容包括0D 0A,很難區分0D 0A是否屬於二進制文件。

每@CodeCaster,添加後的信息在這裏

​​

問題2的標題:如何提取從http體二進制文件的內容?

  • 通過Content-Length?或按Boundary?與消除0D 0A
+0

'0D 0A'是一個典型的windows格式行結尾。下載後您是否意外插入了結尾? – 2014-09-23 09:10:57

+0

不,當我在函數'recv'中調試它時,當從套接字接收數據時,'0D 0A'已經在數據緩衝區中。 – zangw 2014-09-23 09:13:49

+0

POST頭中是否有'Content-Length'?如果是的話,你應該只接受頭中指定的字節數。 – Csq 2014-09-23 09:28:28

回答

0

如果文件內容和邊界之間沒有0D 0A,該怎麼辦?因爲如果二進制文件的內容包括0D 0A,則很難區分0D 0A是否屬於二進制文件。

用戶代理必須確保選擇一個不存在於有效負載中的邊界。

相關問題