利用Curl库实现文件上传,利用Multi-partformposts应该是最好的方法。何为Multi-part?其实,就我理解,就是在Post提交的时候,有不同的数据单元,每个单元有自己的名称与内容,内容可以是文本的,也可以是二进制的。同时,每个数据单元都可以有自己的消息头,MIME类型,这些数据单元组成一个链表,提交到HTTP服务器。libcurl提供了方便的api用于支持multi-partformposts。使用curl_formadd函数,可以添加不同的数据数据单元,然后提交到服务器。
使用libcurl的大概流程:
curl_easy_init()
curl_easy_setopt()
curl_easy_perform()
curl_easy_cleanup()
下面是一个multi-part formposts的例子(更详细的使用,请参考:http://curl.haxx.se/libcurl/c/curl_formadd.html):
int main()
{
curl_global_init(CURL_GLOBAL_WIN32);
CURL*easy_handle = curl_easy_init();
// 使用multi-parts form post
curl_easy_setopt(easy_handle, CURLOPT_URL,http://localhost:2210/Default.aspx); curl_httppost*post = NULL; curl_httppost *last =NULL;
// 文本数据
curl_formadd(&post,&last, CURLFORM_COPYNAME, "name",CURLFORM_COPYCONTENTS, "JGood",CURLFORM_END); curl_formadd(&post,&last, CURLFORM_COPYNAME, "address",CURLFORM_COPYCONTENTS, "HangZhou", CURLFORM_END);
// 文本文件中的数据
curl_formadd(&post,&last, CURLFORM_COPYNAME, "file",CURLFORM_FILECONTENT, "ReadMe.txt", CURLFORM_END);
curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST,post);
curl_easy_perform(easy_handle);
curl_formfree(post);
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
return 0;
}
最后要说明的是,所有在easy handle上设置的属性都是”sticky”的,什么意思?就是说在easyhandle上设置的属性都将被保存,即使执行完curl_easy_perform之后,这些属性值仍然存在。通过将CURLOPT_HTTPGET设为1可以使easyhandle回到最原始的状态:
curl_easy_setopt(easy_handle, CURLOPT_HTTPGET,1L);
显示进度
int progress_callback(void *clientp, double dltotal, doubledlnow, double ultotal, doubleulnow);
在C++中使用libcurl
class AClass {
}
用上面提供方法可以很方便的实现文件的上传。
特别要说的是,curl类库的版本最好要用7.21.*版本,这几天跟一个同事其他人写的代码调试Curl文件上传,文件是可以上传成功,但是只能传输小文件比较快,上传10M以上文件时,要花费非常的时间,后来发现用的Curl类库是2006年的V7.15版的,直接替换V7.21.6版本,速度超快。
curl类库下载地址http://curl.haxx.se/download.html