Content-Type: multipart/form-data; boundary=尽量长的分割字符串。
http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
c语言封装报文,上传几个变量和一个文件
定义一个字符数组https_buf。
#define bountry_test "----WebkitFormBoundary7MA4YWxkTrZu0gw"
sprintf(https_buf,"----%s\r\n\
Content-Disposition: form-data; name=\"变量1\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量2\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量3\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量4\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"file\"; filename=\"文件名\"\r\n\
Content-Type: text/plain\r\n\r\n\
%s\
\r\n----%s--\r\n",bountry_test,变量1,bountry_test,变量2,bountry_test,变量3,bountry_test,变量4,bountry_test,文件中的数据,bountry_test);
int contet_len = strlen(https_buf);
FT_LogPrint(LOG_ERROR, "contet_len = %d\r\n",contet_len);
snprintf(https_buf, sizeof(https_buf),\
"POST %s HTTP/1.1\r\n\
Host: %s\r\n\
Accept: */*\r\n\
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0\r\n\
Content-Type: multipart/form-data; boundary=--%s\r\n\
Content-Length: %d\r\n\
\r\n\
----%s\r\n\
Content-Disposition: form-data; name=\"变量1\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量2\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量3\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"变量4\"\r\n\r\n\
%s\
\r\n----%s\r\n\
Content-Disposition: form-data; name=\"file\"; filename=\"文件名\"\r\n\
Content-Type: text/plain\r\n\r\n\
%s\
\r\n----%s--\r\n",服务器文件上传路径, host,bountry_test,contet_len,bountry_test,变量1,bountry_test,变量2,bountry_test,变量3,bountry_test,变量4,bountry_test,文件中的数据,bountry_test);