利用curl下載檔案,包括Get和Post
阿新 • • 發佈:2018-11-13
#define STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES 60000000000 #define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL 3 struct myprogress { double lastruntime; CURL *curl; }; size_t write_data(char *buffer, size_t size, size_t nitems, void *outstream) { int written = fwrite(buffer, size, nitems, (FILE*)outstream); return written; } static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow, int a) { struct myprogress *myp = (struct myprogress *)p; CURL *curl = myp->curl; DoEvents(); double dDowning = 0.0, dDwownTotal = 0.0; curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dDowning); int nRandom = rand(); if (dDowning == 0) switch (nRandom % 7) { case 0:acedSetStatusBarProgressMeter(_T("正"), 0, 100); break; case 1:acedSetStatusBarProgressMeter(_T("正在"), 0, 100); break; case 2:acedSetStatusBarProgressMeter(_T("正在連"), 0, 100); break; case 3:acedSetStatusBarProgressMeter(_T("正在連線"), 0, 100); break; case 4:acedSetStatusBarProgressMeter(_T("正在連線."), 0, 100); break; case 5:acedSetStatusBarProgressMeter(_T("正在連線.."), 0, 100); break; case 6:acedSetStatusBarProgressMeter(_T("正在連線..."), 0, 100); break; default: break; } else if (dDowning < 2048) acedSetStatusBarProgressMeter(_T("正在下載..."), 0, 100); else { curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dDwownTotal); acedSetStatusBarProgressMeterPos(dDowning / dDwownTotal * 100); } if (dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES) return 1; return 0; } /////////////////////////////////////////////////////這是Get int DownloadFileAndSaveToLocal(const char* szUrl, const char* szLocalPath) { CURL *pCurl; FILE* pFile = fopen(szLocalPath, "wb"); pCurl = curl_easy_init(); struct myprogress prog; prog.lastruntime = 0; prog.curl = pCurl; curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, (void*)pFile); curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 1); curl_easy_setopt(pCurl, CURLOPT_URL, szUrl); curl_easy_setopt(pCurl, CURLOPT_XFERINFOFUNCTION, xferinfo); curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, &prog); curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); acedSetStatusBarProgressMeter(_T("正在下載..."), 0, 100); int nOK = curl_easy_perform(pCurl); acedRestoreStatusBar(); fclose(pFile); curl_easy_cleanup(pCurl); return nOK; } /////////////////////////////////////////////////////這是Post int DownloadFileAndSaveToLocal_Post(const char* szUrl, const char* szLocalPath, const char* szJsonData) { CURL *pCurl; FILE* pFile = fopen(szLocalPath, "wb"); pCurl = curl_easy_init(); struct myprogress prog; prog.lastruntime = 0; prog.curl = pCurl; CURLcode code; curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, (void*)pFile); curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, write_data); curl_slist *http_headers = NULL; http_headers = curl_slist_append(http_headers, "Accept: application/json"); http_headers = curl_slist_append(http_headers, "Content-Type: application/json"); http_headers = curl_slist_append(http_headers, "charsets: utf-8"); curl_easy_setopt(pCurl, CURLOPT_CUSTOMREQUEST, "POST"); code = curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, http_headers); curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 1); curl_easy_setopt(pCurl, CURLOPT_URL, szUrl);//"http://218.25.36.152:20179/api/DataInteroperability/GetMdbFile?tid=D0DD2310F638433DA70F698DCCBC600A" curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, szJsonData); curl_easy_setopt(pCurl, CURLOPT_XFERINFOFUNCTION, xferinfo); curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, &prog); curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); acedSetStatusBarProgressMeter(_T("正在下載..."), 0, 100); int nOK = curl_easy_perform(pCurl); acedRestoreStatusBar(); fclose(pFile); curl_easy_cleanup(pCurl); return nOK; }