libcurl的错误,curl_easy_perform()失败:C++
问题描述:
我写了这个代码使用libcurl的下载文件:libcurl的错误,curl_easy_perform()失败:C++
#ifndef CHECK_RESOURCES_H
#define CHECK_RESOURCES_H
#include <string>
#include <stdio.h>
#include <curl/curl.h>
// #include <bzlib.h>
void progress_bar (void* ptr, double TotalToDownload, double NowDownloaded, \
double TotalToUpload, double NowUploaded) {
printf("%f : %f \n", TotalToDownload, NowDownloaded);
}
void download_file() {
CURL *curl;
CURLcode res;
char outFileName[FILENAME_MAX] = "shape_predictor_68_face_landmarks.dat.bz2";
std::string url = "http://ufpr.dl.sourceforge.net/project/dclib/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2";
FILE *fp;
curl = curl_easy_init();
if (curl) {
fp = fopen (outFileName, "wb");
curl_easy_setopt (curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
// Internal CURL progressmeter must be disabled if we provide our own callback
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
// Install the callback function
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_bar);
res = curl_easy_perform (curl);
if (res != CURLE_OK) {
fprintf(stderr, "%s%s\n", "curl_easy_perform() failed : ", curl_easy_strerror(res));
}
curl_easy_cleanup (curl);
fclose (fp);
}
}
void extract_bz2() {
}
void check_dlib_landmark_weights (const std::string& name) {
if (FILE *file = fopen(name.c_str(), "r")) {
fclose(file);
} else {
download_file();
}
}
#endif // CHECK_RESOURCES_H
的问题是,当我运行的代码,它给出了这样的输出:
0.000000 : 0.000000
0.000000 : 0.000000
curl_easy_perform() failed : Operation was aborted by an application callback
我不明白为什么这是失败的。我检查了我正在使用的链接,它是一个工作链接(下载文件没有任何问题)。我该如何纠正?
答
CURLOPT_PROGRESSFUNCTION
预计回调函数将返回0值,目前您的函数返回void。如果修改progress_bar
函数以返回int
而不是void
并将return 0;
添加到它的末尾以解决问题。
如果您不提供自己的回叫会发生什么? –
如果我不提供进度条,那么它会继续下载 –