C++ libcurl upload file / 使用 libcurl 做檔案上傳

整理一下留著以後應該還是會用到

#include <stdio.h>
#include <iostream>
#include <string>
#define CURL_STATICLIB
#include "curl/curl.h"

size_t write_console(void *buffer, size_t size, size_t count, void *userp) {
  std::string str((const char*)buffer, size*count);
  std::cout<<str;
  return count*size;
}

void post_file()
{
  const char* POSTURL =  "http://SITE/PATH/TO/CONTROLLER/ACTION";
  CURL *curl = curl_easy_init();
  char* pUrlName = "Picture.jpg";

  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_console);
  curl_httppost *formpost = 0, *lastptr  = 0;

  // add parameters and files
  curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "File1", CURLFORM_FILE, "Picture.jpg", CURLFORM_FILENAME, pUrlName, CURLFORM_END);
  curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filename", CURLFORM_COPYCONTENTS, "Picture.jpg", CURLFORM_END);
  curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "uid", CURLFORM_COPYCONTENTS, "0012", CURLFORM_END);
  curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "timestamp", CURLFORM_COPYCONTENTS, "1636807618", CURLFORM_END);

  curl_easy_setopt(curl, CURLOPT_URL, POSTURL);
  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

  CURLcode res = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

int main(void)
{	  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL);
  post_file();
  curl_global_cleanup();
  return 0;
}