libcurl库的简介(二)


下面是使用libcurl库实现文件上传的一个实例:

void
CDataProcess::sendFileToServer(void) { string netIp = strNetUrl + "SaveFile"; for (int i = 0; i < taskZipVector.size(); ++i) { string strFileName = taskZipVector[i]; string strFilePath = strAppPath + "\\Task\\"+ strFileName + ".zip"; CURL *curl = NULL; string readFile = ""; struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; struct curl_slist *headerlist=NULL; static const char buf[] = "Expect:"; if(-1 == _access(strFilePath.c_str(),0)) { return ; } curl_global_init(CURL_GLOBAL_ALL); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "fileContent", CURLFORM_FILE, strFilePath.c_str(), CURLFORM_END); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "filename", CURLFORM_COPYCONTENTS, strFileName.c_str(), CURLFORM_END); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "send", CURLFORM_END); curl = curl_easy_init(); headerlist = curl_slist_append(headerlist, buf); curl_easy_setopt(curl, CURLOPT_URL, netIp.c_str()); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { //CFuncs::WriteLogInfo(SLT_ERROR, "finshUpdate() curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); return ; } isSendedFlag = 1; //设置已传送文件标志 curl_easy_cleanup(curl); curl_formfree(formpost); curl_slist_free_all (headerlist); } }

struct curl_httppost {
  struct curl_httppost *next; /* next entry in the list */
  char *name; /* pointer to allocated name */
  long namelength; /* length of name length */
  char *contents; /* pointer to allocated data contents */
  long contentslength; /* length of contents field, see also
  CURL_HTTPPOST_LARGE */
  char *buffer; /* pointer to allocated buffer contents */
  long bufferlength; /* length of buffer field */
  char *contenttype; /* Content-Type */
  struct curl_slist *contentheader; /* list of extra headers for this form */
  struct curl_httppost *more; /* if one field name has more than one
  file, this link should link to following
  files */
  long flags; /* as defined below */

  /* specified content is a file name */
  #define CURL_HTTPPOST_FILENAME (1<<0)
  /* specified content is a file name */
  #define CURL_HTTPPOST_READFILE (1<<1)
  /* name is only stored pointer do not free in formfree */
  #define CURL_HTTPPOST_PTRNAME (1<<2)
  /* contents is only stored pointer do not free in formfree */
  #define CURL_HTTPPOST_PTRCONTENTS (1<<3)
  /* upload file from buffer */
  #define CURL_HTTPPOST_BUFFER (1<<4)
  /* upload file from pointer contents */
  #define CURL_HTTPPOST_PTRBUFFER (1<<5)
  /* upload file contents by using the regular read callback to get the data and
  pass the given pointer as custom pointer */
  #define CURL_HTTPPOST_CALLBACK (1<<6)
  /* use size in 'contentlen', added in 7.46.0 */
  #define CURL_HTTPPOST_LARGE (1<<7)

  char *showfilename; /* The file name to show. If not set, the
  actual file name will be used (if this
  is a file part) */
  void *userp; /* custom pointer used for
  HTTPPOST_CALLBACK posts */
  curl_off_t contentlen; /* alternative length of contents
  field. Used if CURL_HTTPPOST_LARGE is
  set. Added in 7.46.0 */
};

struct curl_slist {
  char *data;
  struct curl_slist *next;
};

CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, struct curl_httppost **last_post,.);

猜你喜欢

转载自www.cnblogs.com/Toney-01-22/p/9935191.html