cpp libcurl在http帖子调用中发送zip文件,而无需使用multipart \ form-data

时间:2019-10-08 06:26:21

标签: c++ upload multipartform-data libcurl zipfile

我们在cpp libcurl中使用formdata通过以下代码将数据发送到我们的服务器:

curl_formadd(&form, &lastptr, CURLFORM_COPYNAME, "file", CURLFORM_FILE, filePath.c_str(), CURLFORM_END);

curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, form); 

但是现在我们的服务器已更新为可以接受http请求正文中的二进制文件,而不是multipart \ form-data。我发现curl命令可以在不使用multipart \ form-data的情况下附加zipfile,如下所示

curl --request POST --data-binary "@file" $URL

但是我找不到cpp curl中的等效项。我们的要求是在http请求中上传一个zipfile

2 个答案:

答案 0 :(得分:0)

您需要设置CURLOPT_READDATACURLOPT_READFUNCTION选项。 Curl将以您通过CURLOPT_READFUNCTION作为参数重复调用CURLOPT_READDATA,直到返回0或CURL_READFUNC_ABORT

默认情况下,libcurl假定您的READFUNCTION从文件句柄读取。 documentation显示以下示例:

size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
{
  FILE *readhere = (FILE *)userdata;
  curl_off_t nread;

  /* copy as much data as possible into the 'ptr' buffer, but no more than
     'size' * 'nmemb' bytes! */
  size_t retcode = fread(ptr, size, nmemb, readhere);

  nread = (curl_off_t)retcode;

  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
          " bytes from file\n", nread);
  return retcode;
}

void setup(char *uploadthis)
{
  FILE *file = fopen("rb", uploadthis);
  CURLcode result;

  /* set callback to use */
  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

  /* pass in suitable argument to callback */
  curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);

  result = curl_easy_perform(curl);
}

如果您想从内存缓冲区中读取数据,则您的READFUNCTION需要记住一个偏移量,并且每次调用memcpy都会对其进行分块,直到到达内存缓冲区的末尾为止。

答案 1 :(得分:0)

我已经使用POST_FIELDS上传了一个zip文件。以二进制模式将zip文件读入char指针,并将其传递给这样:

    char * buffer;
    //read file into buffer
    curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)total);
    curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, buffer);

如果我错了请改正我或者建议我替代