gpt4 book ai didi

c++ libcurl 进度回调下载不工作

转载 作者:行者123 更新时间:2023-11-28 05:34:23 28 4
gpt4 key购买 nike

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

当前下载的大小作为参数给出,然后可以使用该参数创建进度条。

Here也是所用服务和请求的文档:

最佳答案

根据 libcurl 文档:

CURLOPT_XFERINFOFUNCTION explained

Unknown/unused argument values passed to the callback will be set to zero (like if you only download data, the upload size will remain 0). Many times the callback will be called one or more times first, before it knows the data sizes so a program must be made to handle that.

如果回调从不在下载期间为您提供非零值,则:

  1. libcurl 中存在错误(不太可能)

  2. libcurl 根本不知道大小(更有可能),例如下载的编码方式是否会阻止有效计算大小。

    <

关于c++ libcurl 进度回调下载不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667599/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com