我使用curl進行上傳和下載,並嘗試從curl中包含提供的進度條。上傳文件時,我設法讓進度條工作,但不幸的是,回調函數在下載時只接收到0個值。C++ libcurl進度回調,下載不起作用
下面是針對下載設置的選項:
::curl_easy_reset(m_pimpl->curl) ;
::curl_easy_setopt(m_pimpl->curl, CURLOPT_SSL_VERIFYPEER, 0L) ;
::curl_easy_setopt(m_pimpl->curl, CURLOPT_SSL_VERIFYHOST, 0L) ;
::curl_easy_setopt(m_pimpl->curl, CURLOPT_HEADERFUNCTION, &CurlAgent::HeaderCallback) ;
::curl_easy_setopt(m_pimpl->curl, CURLOPT_HEADERDATA, this) ;
::curl_easy_setopt(m_pimpl->curl, CURLOPT_HEADER, 0L) ;
::curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.c_str()); // "GET" in download
::curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error) ;
::curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlAgent::Receive) ;
::curl_easy_setopt(curl, CURLOPT_WRITEDATA, this) ;
//setting the progress callback function
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, this);
CURLcode curl_code = ::curl_easy_perform(curl);
,這是用於進度條回調:
static int progress_callback(void *ptr, curl_off_t TotalDownloadSize, curl_off_t finishedDownloadSize, curl_off_t TotalToUpload, curl_off_t NowUploaded) {
curl_off_t processed = (TotalDownloadSize > TotalToUpload) ? finishedDownloadSize : NowUploaded;
curl_off_t total = (TotalDownloadSize > TotalToUpload) ? TotalDownloadSize : TotalToUpload;
...
return 0;
}
如前所述,當我執行文件的參數上傳TotalToUpload
和NowUploaded
包含正確的值。但是當下載全部四個參數時包含0
!? 下載文件以獲得正確尺寸時,是否必須設置另一個選項?
替代解決方案
我找到了一個替代的解決方案,購買使用提供有關其還包含文件大小的驅動器上的文件的信息另一個請求。 在設置回調寫功能
::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlAgent::Receive)
當前下載的大小是作爲與它然後可以創建進度條參數。
Here也是使用的服務的文件和要求:
你能提供一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve),包括一個真實的URL,來證明這一點嗎?你要求什麼樣的URL? HTTP? FTP?什麼是'方法'設置?如果你正在檢索一個HTTP url,並將'method'設置爲'「GET」'那麼你不應該像這樣''CURLOPT_CUSTOMREQUEST',你應該使用'CURLOPT_HTTPGET'來代替。 –
我使用它與從Google驅動器下載文件的組合,因此提供一個工作示例是困難的... 我試圖設置'CURLOPT_HTTPGET'標誌,而不是有所作爲 – wasp256
請提供一個MCVE(強調**最小**)的公共網址,顯示相同的問題。 –