libcurl post上传文件

本文介绍了如何使用CURL库实现文件上传的功能,包括初始化、填充表单数据、设置URL和执行请求等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <string.h>
 
#include <curl/curl.h>
 
int main(int argc, char *argv[])
{
  CURL *curl;
  CURLcode res;
 
  struct curl_httppost *formpost=NULL;
  struct curl_httppost *lastptr=NULL;
  struct curl_slist *headerlist=NULL;
  static const char buf[] = "Expect:";
 
  curl_global_init(CURL_GLOBAL_ALL);
 
  /* Fill in the file upload field */ 
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "sendfile",
               CURLFORM_FILE, "postit2.c",
               CURLFORM_END);
 
  /* Fill in the filename field */ 
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "filename",
               CURLFORM_COPYCONTENTS, "postit2.c",
               CURLFORM_END);
 
 
  /* Fill in the submit field too, even if this is rarely needed */ 
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "submit",
               CURLFORM_COPYCONTENTS, "send",
               CURLFORM_END);
 
  curl = curl_easy_init();
  /* initalize custom header list (stating that Expect: 100-continue is not
     wanted */ 
  headerlist = curl_slist_append(headerlist, buf);
  if(curl) {
    /* what URL that receives this POST */ 
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/examplepost.cgi");
    if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
      /* only disable 100-continue header if explicitly requested */ 
      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
 
    /* Perform the request, res will get the return code */ 
    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
 
    /* always cleanup */ 
    curl_easy_cleanup(curl);
 
    /* then cleanup the formpost chain */ 
    curl_formfree(formpost);
    /* free slist */ 
    curl_slist_free_all (headerlist);
  }
  return 0;
}

使用libcurl库进行POST方法上传文件的步骤如下: 1. 初始化curl库:`curl_global_init(CURL_GLOBAL_ALL);` 2. 创建curl句柄:`CURL* curl = curl_easy_init();` 3. 设置请求URL:`curl_easy_setopt(curl, CURLOPT_URL, url);` 4. 设置请求方式为POST:`curl_easy_setopt(curl, CURLOPT_POST, 1L);` 5. 设置上传文件:`curl_easy_setopt(curl, CURLOPT_READDATA, file);` 其中,`file`为你要上传文件文件指针。 6. 设置上传文件大小:`curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size);` 其中,`file_size`为你要上传文件的大小。 7. 设置上传文件名:`curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name);` 其中,`file_name`为你要上传文件文件名。 8. 执行请求:`curl_easy_perform(curl);` 9. 清理curl句柄:`curl_easy_cleanup(curl);` 完整的示例代码如下: ``` #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; FILE *file; const char *url = "http://example.com/upload.php"; const char *file_name = "example.txt"; long file_size; file = fopen(file_name, "rb"); if (!file) { fprintf(stderr, "Failed to open file '%s'\n", file_name); return 1; } fseek(file, 0L, SEEK_END); file_size = ftell(file); rewind(file); curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_READDATA, file); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name); res = curl_easy_perform(curl); if (res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } fclose(file); curl_global_cleanup(); return 0; } ``` 注意,这只是一个简单的示例,实际应用中还需要添加错误处理和其他必要的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值