http post 协议 向服务器提交图片

理解http的POST协议。它一般由三部分组成:协议头,具体内容以及协议尾。如下例所示:

POST /upload_file/UploadFile HTTP/1.1
Accept: text/plain, */*
Accept-Language: zh-cn
Host: 192.168.29.65:80
Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6
User-Agent: Mozilla/4.0 (compatible; OpenOffice.org)
Content-Length: 424
Connection: Keep-Alive

 -----------------------------7d33a816d302b6
Content-Disposition: form-data; name="userfile1"; filename="E:\s"
Content-Type: application/octet-stream
a
bb
XXX
ccc
-----------------------------7d33a816d302b6
Content-Disposition: form-data; name="text1"
foo
-----------------------------7d33a816d302b6
Content-Disposition: form-data; name="password1"
bar
-----------------------------7d33a816d302b6--

 

实例的红色字体部分就是协议的头。给服务器上传数据时,并非协议头每个字段都得说明,其中,content-type是必须的,它包括一个类似标志性质的名为boundary的标志,它可以是随便输入的字符串。对后面的具体内容也是必须的。它用来分辨一段内容的开始。绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有Content-Disposition, Content-Type以及Content-Transfer-Encoding等说明字段。最后的紫色部分就是协议的结尾了。

下面给出关键的VC实现代码及相关说明:

首先,根据HTTP的POST协议,封装协议头。

// strBoundary 为协议中的boundary

 CString MakeRequestHeaders(CString &strBoundary)
{
    CString strFormat=_T("");
    CString strData =_T("");
    strFormat += _T("Content-Type: multipart/form-data; boundary=%s\r\n"); 
    strFormat +=_T("Host: %s:%d\r\n");
    strData.Format(strFormat, strBoundary,m_strSeverName, m_nPort);


    return strData;
}

其次,封装数据前面的描述部分:

CString MakePreFileData(CString &strBoundary, CString &strFileName)
{
 //Content-Type:
 //JPG image/pjpeg
 //PNG image/x-png
 //BMP image/bmp
 //TIF image/tiff
  //GIF image/gif
 CString strFormat=_T("");
 CString strData=_T("");
    strFormat += _T("--%s");
 strFormat += _T("\r\n");
 strFormat += _T("Content-Disposition: form-data; name=\"filedata\"; filename=\"%s\"");
 strFormat += _T("\r\n");
 strFormat += _T("Content-Type: image/bmp");
 strFormat += _T("\r\n");
 strFormat += _T("Content-Transfer-Encoding: binary");
 strFormat += _T("\r\n\r\n");
 
 strData.Format(strFormat, strBoundary, strFileName);
 
 return strData; 
}

 第三,封装协议尾。

CString MakePostFileData(CString &strBoundary)
{
     CString strFormat;
     CString strData;
 
     strFormat = _T("\r\n");
     strFormat += _T("--%s");
     strFormat += _T("\r\n");
     strFormat += _T("Content-Disposition: form-data; name=\"submitted\"");
     strFormat += _T("\r\n\r\n");
     strFormat += _T("submit");
     strFormat += _T("\r\n");
     strFormat += _T("--%s--");
     strFormat += _T("\r\n");
 
     strData.Format(strFormat, strBoundary, strBoundary);
 
     return strData;
}

 经过上面这些工作,http协议这部分工作差不多完成了,需要注意的是传输文件时,form-data中的name字段要和服务器中的名字一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值