簡體   English   中英

C ++ libcurl進度回調與下載不起作用

[英]c++ libcurl progress callback with download not working

我正在使用curl進行上傳和下載,還嘗試包含curl提供的進度條。 上傳文件時,我設法使進度條正常工作,但是不幸的是,回調函數在下載時僅收到0值。

以下是為下載設置的選項:

::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 )

當前下載的大小作為參數給出,然后可以使用它創建進度條。

也是所用服務和請求的文檔:

根據libcurl文檔:

CURLOPT_XFERINFOFUNCTION解釋

傳遞給回調的未知/未使用的參數值將設置為零 (例如,如果僅下載數據,則上傳大小將保持為0)。 很多時候,回調在知道數據大小之前會先被調用一次或多次,因此必須編寫一個程序來處理該回調

如果在下載過程中回調從未給您提供非零值,則可以:

  1. libcurl中有一個錯誤(可能性較小)

  2. libcurl 根本不知道大小(更有可能),例如,下載內容的編碼方式無法有效地計算大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM