如何将带有-F选项的curl命令转换为libcurl

时间:2018-08-20 02:50:35

标签: c++ curl libcurl

通过使用类似curl的命令,我成功将图像文件上传到我的博客。

curl -F 'access_token=xxx' -F 'blogName=xxx' -F 'uploadedfile=@xxx.png' https://www.tistory.com/apis/post/attach

然后...要在我的c ++项目中使用它,我将其转换为libcurl,如下所示。

curl = curl_easy_init();

if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.tistory.com/apis/post/attach");
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.61.0");

    curl_mime *formpost = curl_mime_init(curl);
    curl_mimepart *part = nullptr;

    part = curl_mime_addpart(formpost);
    curl_mime_name(part, "access_token");
    curl_mime_data(part, "xxx", CURL_ZERO_TERMINATED);

    part = curl_mime_addpart(formpost);
    curl_mime_name(part, "blogName");
    curl_mime_data(part, "xxx", CURL_ZERO_TERMINATED);

    part = curl_mime_addpart(formpost);
    curl_mime_name(part, "uploadedfile");
    curl_mime_filename(part, "xxx.png");
    curl_mime_type(part, "image/png");

    curl_easy_setopt(curl, CURLOPT_MIMEPOST, formpost);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

    res = curl_easy_perform(curl);

    ...
}

此转换后的代码不起作用。结果是响应代码400。实际上我不知道libcurl的哪个功能与curl命令的-F选项相对应。有人让我知道了如何将顶部的curl命令转换为libcurl,或者我需要研究什么功能。预先感谢。

1 个答案:

答案 0 :(得分:1)

运行以下命令(此处有用的生活技巧!)后:

curl -F 'access_token=xxx' -F 'blogName=xxx' -F 'uploadedfile=@xxx.png' https://www.tistory.com/apis/post/attach --libcurl example.cc && cat example.cc

我得到了以下代码(为便于阅读,整理了一些代码):

#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;
  curl_mime *mime1;
  curl_mimepart *part1;

  mime1 = NULL;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "https://www.tistory.com/apis/post/attach");
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
  mime1 = curl_mime_init(hnd);
  part1 = curl_mime_addpart(mime1);
  curl_mime_data(part1, "xxx", CURL_ZERO_TERMINATED);
  curl_mime_name(part1, "access_token");
  part1 = curl_mime_addpart(mime1);
  curl_mime_data(part1, "xxx", CURL_ZERO_TERMINATED);
  curl_mime_name(part1, "blogName");
  part1 = curl_mime_addpart(mime1);
  curl_mime_filedata(part1, "xxx.png");
  curl_mime_name(part1, "uploadedfile");
  curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.60.0");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
  curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/home/MY_USER/.ssh/known_hosts");
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;
  curl_mime_free(mime1);
  mime1 = NULL;

  return (int)ret;
}