使用libcurl POST数据和上传文件

为了具备通用性,将文件的内容读到了fc变量中,fclen是fc的长度。fc也能够是任何其它内容。curl 是 libcurl句柄。演示省略了不少显而易见的步骤。app

 

1. 普通的post请求,这里用curl_easy_escape对fc作了编码curl

std::string data("req=plain");post

data.append("&file=");编码

char *efc = curl_easy_escape(curl, fc, fclen);url

data.append(efc)code

curl_free(encoded);orm

 

curl_easy_setopt(curl, CURLOPT_URL, PURGE_URL);ip

curl_easy_setopt(curl, CURLOPT_POST, 1L);string

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());ast

curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.size());

 

2. multipart/formdata请求

struct curl_httppost *formpost = 0;

struct curl_httppost *lastptr  = 0;

curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "reqformat", CURLFORM_PTRCONTENTS, "plain", CURLFORM_END);

curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_PTRCONTENTS, fc, CURLFORM_CONTENTSLENGTH, fclen, CURLFORM_END);

 

curl_easy_setopt(curl, CURLOPT_URL, URL);

curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

curl_easy_perform(curl);

curl_formfree(formpost);

 

3. multipart/formdata请求,不把文件读入fc,其它步骤相同

curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_FILE, "/path/filename", CURLFORM_END);

 

4. 经过put上传文件

curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

curl_easy_setopt(curl, CURLOPT_PUT, 1L);

curl_easy_setopt(curl, CURLOPT_READDATA, fp);   // FILE *fp = fopen("/path/filename");

curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, fsize);  // fsize = sizeof /path/filename

 

5. 发送本身的Header

struct curl_slist *slist = 0;

slist = curl_slist_append(slist, "Blog-X-User: username");

slist = curl_slist_append(slist, "Blog-X-Signature: signature");

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);

curl_slist_free_all(slist);

相关文章
相关标签/搜索