目前,我尝试在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
。
在此specs中,我们知道应在Boundary
之前添加文件行结尾。但是,第一个问题:如果文件内容和边界之间没有0D 0A怎么办?因为如果二进制文件的内容包括0D 0A
,则很难区分{{1}是否属于二进制文件。
每个@CodeCaster,在这里添加帖子消息的标题
问题2:如何从http正文中提取二进制文件内容?
0D 0A
?还是Content-Length
?消除Boundary
。答案 0 :(得分:0)
如果文件内容和边界之间没有0D 0A怎么办?因为如果二进制文件的内容包括0D 0A,则很难区分0D 0A是否属于二进制文件。
用户代理必须确保选择有效负载中不存在的边界。