2
目前,我嘗試在Windows下使用C++實現一個簡單的Web服務器。爲了支持文件上傳,我的代碼中實現了POST
。如何從POST請求的HTTP正文提取二進制文件內容?
現在,當一個二進制文件通過IE瀏覽器上傳時,兩個額外的字符0D
和0A
被添加到文件的末尾。
上傳
文件內容上傳
這裏前後文件內容是一些代碼片段
// 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
是通過網絡瀏覽器添加的。
在這個specs,我們知道文件行Boundary
之前應該添加到結束。但是,第一個問題:如果文件內容和邊界之間沒有0D 0A會怎麼樣?因爲如果二進制文件的內容包括0D 0A
,很難區分0D 0A
是否屬於二進制文件。
每@CodeCaster,添加後的信息在這裏
問題2的標題:如何提取從http體二進制文件的內容?
- 通過
Content-Length
?或按Boundary
?與消除0D 0A
。
'0D 0A'是一個典型的windows格式行結尾。下載後您是否意外插入了結尾? – 2014-09-23 09:10:57
不,當我在函數'recv'中調試它時,當從套接字接收數據時,'0D 0A'已經在數據緩衝區中。 – zangw 2014-09-23 09:13:49
POST頭中是否有'Content-Length'?如果是的話,你應該只接受頭中指定的字節數。 – Csq 2014-09-23 09:28:28