目前,我正在尝试在Windows下使用C++实现一个简单的Web服务器。为了支持文件上传,在我的代码中实现了POST
。
现在,当一个二进制文件通过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
。
Boundary
之前添加文件行结束符。然而,第一个问题是:如果文件内容和Boundary之间没有0D 0A怎么办?因为如果二进制文件的内容包含0D 0A
,很难区分0D 0A
是否属于二进制文件。根据@CodeCaster的建议,在此处添加帖子消息头。
通过
Content-Length
?还是通过Boundary
?并消除0D 0A
。
0D 0A
是典型的 Windows 格式行尾。您在下载后意外在结尾插入了一个吗? - πάντα ῥεῖcontent-Length
是 HTTP 主体的长度,包括文件内容、边界、内容分发等。 - zangwContent-type
吗? - CodeCaster