繁体   English   中英

cpp libcurl 在 http 后调用中发送 zip 文件而不使用 multipart\form-data

[英]cpp libcurl send zip file in http post call without using multipart\form-data

我们在 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

您需要设置CURLOPT_READDATACURLOPT_READFUNCTION选项。 Curl 将使用您作为CURLOPT_READDATA作为参数传递的任何内容重复调用CURLOPT_READFUNCTION ,直到它返回 0 或CURL_READFUNC_ABORT

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

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分块,直到它到达内存缓冲区的末尾。

我使用 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);

如果我错了,请纠正我或建议我替代

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM