如何使用libcurl + POST上传文件?

时间:2019-01-24 10:37:27

标签: c file-upload libcurl

我正在尝试使用libcurl(在C中)将文件上传到Web服务器。服务器要求我使用POST,而不是PUT(这是CURLOPT_UPLOAD所使用的)。我能够成功上传状态为200的文件,但是当我从服务器下载文件时,文件为空。服务器没有问题,因为我已经通过POSTMAN进行了验证,它接受POST作为文件,并在下载时将文件和内容一起发送。

int HttpUploadFile(const char *url, const char *filePath, Buffer 
*response){
  int status;
   CURL *handle;
   FILE *fp;
   struct stat file_info;

   int exist = stat(filePath, &file_info);
   if(exist != 0) {
     ERROR("stat() failed: %s", strerror(errno));
     return -1;
   }

  fp = fopen(filePath, "rb");
   if (fp == NULL) {
      ERROR("fopen() failed for file : %s %s", filePath, 
strerror(errno));
      return -1;
   }

   status = HttpInitHandle(url, &handle);
   if (status != 0) {
      fclose(fp);
      return -1;
   }

   curl_easy_setopt(handle, CURLOPT_URL, url);
   curl_easy_setopt(handle, CURLOPT_READDATA, fp);
   curl_easy_setopt(handle, CURLOPT_POST, 1L);
   curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE,
                    file_info.st_size);
   curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, HttpReceiveCb);
   curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)response);
   status = HttpSendRequest(handle);
   fclose(fp);
   return status;
}

在HttpSendRequest中,我正在添加标头并发送请求。

设置的POST选项是否有问题?

0 个答案:

没有答案