libcurl构建特性缺失报错:如何创建文件并上传至远程服务器?
问题解决及完整实现方案
一、错误原因与libcurl修复
你遇到的错误是因为当前使用的libcurl库在编译时未启用HTTP表单提交(multipart/form-data)功能,或缺少HTTPS相关依赖。按以下步骤修复:
- 检查libcurl功能支持:执行命令
curl-config --features,查看输出是否包含HTTPPOST和SSL(若目标URL为HTTPS)。 - 安装/重新编译libcurl:
- Debian/Ubuntu系统:安装完整开发包
sudo apt-get install libcurl4-openssl-dev - CentOS/RHEL系统:
sudo yum install libcurl-devel - 手动编译:下载libcurl源码后,执行
./configure --enable-http --with-openssl && make && make install,确保启用HTTP和SSL功能。
- Debian/Ubuntu系统:安装完整开发包
二、完整实现代码
以下代码会先创建指定内容的Temp.wav文件,再通过libcurl以表单形式上传到远程服务器,同时修复了原代码中变量未声明、资源未清理的问题:
#include <stdio.h> #include <curl/curl.h> #include <stdlib.h> #include <string.h> int main(void) { // 第一步:创建Temp.wav文件并写入指定内容 FILE *fp = fopen("Temp.wav", "w"); if (!fp) { perror("Failed to create Temp.wav"); return 1; } const char *file_content = "1234566890jkjfv"; fwrite(file_content, sizeof(char), strlen(file_content), fp); fclose(fp); // 第二步:初始化libcurl相关变量 CURL *curl = NULL; CURLcode res; struct curl_httppost *formpost = NULL; struct curl_httppost *lastptr = NULL; struct curl_slist *headerlist = NULL; static const char buf[] = "Expect:"; // 构建上传文件的表单字段 curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "sendfile", CURLFORM_FILE, "Temp.wav", CURLFORM_END); // 添加文件名字段(若服务器需要接收文件名参数) curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filename", CURLFORM_COPYCONTENTS, "Temp.wav", CURLFORM_END); // 添加提交标识字段(按需) curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "send", CURLFORM_END); // 初始化curl实例 curl = curl_easy_init(); headerlist = curl_slist_append(headerlist, buf); if(curl) { // 设置目标服务器URL(替换为你的实际接收地址) curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/examplepost.cgi"); // 禁用Expect头,避免部分服务器兼容性问题 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); // 设置表单数据 curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); // 执行上传请求 res = curl_easy_perform(curl); // 错误处理 if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } // 清理libcurl资源 curl_easy_cleanup(curl); curl_formfree(formpost); curl_slist_free_all(headerlist); } return 0; }
三、编译与运行
执行以下命令编译代码(确保已安装libcurl开发包):
gcc upload_file.c -o upload_file -lcurl
编译完成后运行可执行文件:
./upload_file
内容的提问来源于stack exchange,提问作者nagaveni
相关产品推荐
相关产品推荐

