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);
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;
}
如前所述,当我执行文件上传时,参数TotalToUpload
和NowUploaded
包含正确的值。但是当下载所有四个参数时都包含0
!?下载文件时是否必须设置另一个选项才能接收正确的大小?
替代解决方案
我找到了另一种解决方案,使用另一个请求购买,该请求提供有关驱动器上文件的信息,其中还包含文件大小。在设置回调写入函数中
::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlAgent::Receive )
当前下载的大小作为参数给出,然后可以使用该参数创建进度条。
这里还有所用服务和请求的文档:
根据libcurl文档:
CURLOPT_XFERINFOFUNCTION解释
传递给回调的未知/未使用的参数值将设置为零(就像您只下载数据一样,上传大小将保持为0)很多次回调都会先被调用一次或多次,然后才知道数据大小,因此必须制作一个程序来处理它。
如果回调是never,在下载过程中会给您非零值,那么:
-
libcurl中有一个错误(可能性较小)
-
libcurl根本不知道大小(更有可能),比如下载的编码方式是否妨碍了有效计算大小。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- 使用 libcurl C++将文件下载到 Ubuntu,简单示例不起作用
- c++libcurl进度回调,下载不起作用
- Qt基于Qt示例从QThread下载文件不起作用