Post上传文件

1, 使用libcurl上传文件
上传个简单的

下载下来成这样了:


上传的时候boundary添加在body头尾巴,一起传上去了:
curl_easy_setopt(m_easyHandle, CURLOPT_POST, 1L);
我上传的时候专门设置了POST但是使用的还是 PUT,我猜可能是应为我用的CURLOPT_READFUNCTION上传文件,没有设置CURLOPT_POSTFIELDS所以内部自动给我转成 PUT了(后面调curl源码的时候关注下)。



2,使用浏览器或任何方式下载刚才上传的文件。
下载的时候添加的boundary也放文件里了:


3,使用wininet上传


下载wininet上传的文件可见上传时添加的boundary没有夹在文件里了。


3,测试一:
wininet上传的时候吧
doundary后的回车换行符去掉会上传失败

上面带\r\n的wininet才能成功上传文件。



4,测试二:
wininet上传的时候消息头不填Content-Type,不在body头和尾添加任何数据。
返回302
暂时重定向


5,测试三:
wininet上传的时候消息头填Content-Type: application/x-www-form-urlencoded,不在body头和尾添加任何数据。
结果同测试二一样。


6,测试四:
使用libcurl上传,消息头不填Content-Type,也不在不在body头和尾添加任何数据。
正常上传,正常下载。





7,总结下:
Content-Type指明两种提交数据的方法,application/x-www-form-urlencoded和multipart/form-data。默认使用前者。

使用urlencoded Post数据的时候,body里的内容是按照&符连接的多个键值对提交。key=vlue&key=vlue&key=vlue…
使用urlencoded Get的数据也是&符连接的多个键值对。

为了上传文件1995年新增了RFC1867:multipart
消息头设置:"Content-Type: multipart/form-data; boundary=MULTI-PARTS-FORM-DATA-BOUNDARY\r\n";
boundary指明任意你想设置的数据分隔符。


开始分隔符后面跟上传文件类型描述,可以提交多个文件,都需要在分隔符前面添加--,最后结尾分隔符也需要添加--
--MULTI-PARTS-FORM-DATA-BOUNDARY\r\n
Content-Disposition: form-data; name=\"upload\"; filename=\"%s\"\r\nContent-Type: text/plain\r\n\r\n

要上传为文件test1.txt
--MULTI-PARTS-FORM-DATA-BOUNDARY\r\n
Content-Disposition: form-data; name=\"upload\"; filename=\"%s\"\r\nContent-Type: image/gif\r\n\r\n
要上传的第二个文件test2.gif
--MULTI-PARTS-FORM-DATA-BOUNDARY--

\r\n符号也是不能少的,前面测试去掉回车换行符显示上传会失败。


Server端收到上传的文件后会
把文件从分隔符里取出来保存,需要Get这些文件时就发送回来。
但是,对于libcurl上传来的文件Server为啥就不按这流程走现在还不清楚,周末自己装个Nginx看看为啥。
妈蛋,这两天先准备下个虚拟机和Centos看看怎么配置Nginx吧,就像是捡了个鼠标准备陪台电脑的感觉。

 

 

.end

posted @ 2016-06-23 16:46  细雨细语  阅读(977)  评论(0编辑  收藏  举报