如何从post请求的HTTP主体中提取二进制文件内容?

时间:2014-09-23 09:09:12

标签: c++ http webserver browser binaryfiles

目前,我尝试在Windows下使用C ++实现一个简单的Web服务器。为了支持文件上传,我的代码中实现了POST

现在,当通过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,则很难区分{{1}是否属于二进制文件。

每个@CodeCaster,在这里添加帖子消息的标题

enter image description here

问题2:如何从http正文中提取二进制文件内容?

  • 0D 0A?还是Content-Length?消除Boundary

1 个答案:

答案 0 :(得分:0)

  

如果文件内容和边界之间没有0D 0A怎么办?因为如果二进制文件的内容包括0D 0A,则很难区分0D 0A是否属于二进制文件。

用户代理必须确保选择有效负载中不存在的边界。