c++libcurl进度回调,下载不起作用

c++ libcurl progress callback with download not working

本文关键字:下载 不起作用 回调 c++libcurl      更新时间:2023-10-16

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

AN这是用于进度条的回调:

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)很多次回调都会先被调用一次或多次,然后才知道数据大小,因此必须制作一个程序来处理它。

如果回调是never,在下载过程中会给您非零值,那么:

  1. libcurl中有一个错误(可能性较小)

  2. libcurl根本不知道大小(更有可能),比如下载的编码方式是否妨碍了有效计算大小。