2016-07-29 41 views
0

我使用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; 
} 

如前所述,當我執行文件的參數上傳TotalToUploadNowUploaded包含正確的值。但是當下載全部四個參數時包含0!? 下載文件以獲得正確尺寸時,是否必須設置另一個選項?

替代解決方案

我找到了一個替代的解決方案,購買使用提供有關其還包含文件大小的驅動器上的文件的信息另一個請求。 在設置回調寫功能

::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlAgent::Receive) 

當前下載的大小是作爲與它然後可以創建進度條參數。

Here也是使用的服務的文件和要求:

+0

你能提供一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve),包括一個真實的URL,來證明這一點嗎?你要求什麼樣的URL? HTTP? FTP?什麼是'方法'設置?如果你正在檢索一個HTTP url,並將'method'設置爲'「GET」'那麼你不應該像這樣''CURLOPT_CUSTOMREQUEST',你應該使用'CURLOPT_HTTPGET'來代替。 –

+0

我使用它與從Google驅動器下載文件的組合,因此提供一個工作示例是困難的... 我試圖設置'CURLOPT_HTTPGET'標誌,而不是有所作爲 – wasp256

+0

請提供一個MCVE(強調**最小**)的公共網址,顯示相同的問題。 –

回答

1

每libcurl的文檔:

CURLOPT_XFERINFOFUNCTION explained

傳遞給回調未知/未使用的參數值將被設置爲零(如果你只下載數據,上傳大小將保持爲0)。 很多時候,回調將首先被調用一次或多次,然後才知道數據大小爲,因此必須編寫一個程序來處理該數據。

如果回調是從未給你非零值在下載過程中,則:

  1. 有libcurl中(不太可能)

  2. libcurl的一個bug 根本不知道大小(更可能),例如下載是否以防止有效計算大小的方式進行編碼。

+0

有沒有辦法找出它是否是第二點? – wasp256

+1

如果下載數據,至少下載的字節數應該增加... –

+0

@DanielStenberg人會這麼認爲,是的。 –