使用libcurl POST数据和上传文件

本文详细介绍了如何使用libcurl进行HTTP请求,包括普通post请求、multipart/formdata请求、通过PUT上传文件以及发送自定义Header的方法。文章还涵盖了文件编码、格式指定、上传文件路径配置、Header设置等关键步骤。
为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度。fc也可以是任何其它内容。curl 是 libcurl句柄。演示省略了很多显而易见的步骤。

1. 普通的post请求,这里用curl_easy_escape对fc做了编码
std::string data("req=plain");
data.append("&file=");
char *efc = curl_easy_escape(curl, fc, fclen);
data.append(efc)
curl_free(encoded);

curl_easy_setopt(curl, CURLOPT_URL, PURGE_URL);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
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);
在Windows环境下使用libcurl库实现FTP上传文件,首先你需要安装libcurl库,它是跨平台的HTTP、FTP其他网络传输协议客户端库。以下是基本步骤: 1. **下载并安装libcurl**: - 访问libcurl官网(https://curl.se/download/)下载适合Windows版本的库开发工具包(例如,mingw-w64或静态编译的二进制版本)。 2. **包含头文件**: 在C/C++项目中添加libcurl的头文件,比如`#include <curl/curl.h>`。 3. **初始化libcurl**: 创建一个CURL handle来管理连接,如`CURL *curl;`,然后初始化它,`curl_global_init(CURL_GLOBAL_DEFAULT);`。 4. **设置选项**: 使用`curl_easy_setopt(curl, CURLOPT_URL, "ftp://your_ftp_url");`设定目标 FTP 地址。另外,设置相应的选项,如 `CURLOPT_USERNAME` `CURLOPT_PASSWORD` 设置登录凭据,`CURLOPT_UPLOAD` 设定为1表示上传模式。 5. **创建文件柄**: 如果需要上传本地文件,用`CURLFORMadd_filedata`函数将文件路径添加到上传表单中。 6. **开始上传**: 使用`curl_easy_perform(curl)`发起请求,并处理可能出现的错误。 7. **清理资源**: 上传完成后,记得关闭curl handle释放全局变量,`curl_easy_cleanup(curl); curl_global_cleanup();`。 下面是一个简单的示例代码片段: ```c #include <curl/curl.h> int main() { CURL *curl; CURLcode res; // 初始化 curl_global_init(CURL_GLOBAL_DEFAULT); // 创建curl handle curl = curl_easy_init(); if(curl) { // 设置FTP URL curl_easy_setopt(curl, CURLOPT_URL, "ftp://your_ftp_url"); // 登录选项 curl_easy_setopt(curl, CURLOPT_USERNAME, "your_username"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "your_password"); // 添加文件数据 struct curl_httppost formpost[1]; struct curl_httppost *lastptr = NULL; curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "file", // 数据名 CURLFORM_FILE, "local_path", // 文件路径 CURLFORM_END); // 设置上传表单 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, formpost); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); // 发送请求 res = curl_easy_perform(curl); // 检查结果并处理错误 if(res != CURLE_OK) fprintf(stderr, "Error: %s\n", curl_easy_strerror(res)); // 清理资源 curl_easy_cleanup(curl); } // 关闭全局 curl_global_cleanup(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值