2016-05-13 75 views
1

我写了这个代码使用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 

我不明白为什么这是失败的。我检查了我正在使用的链接,它是一个工作链接(下载文件没有任何问题)。我该如何纠正?

+0

如果您不提供自己的回叫会发生什么? –

+0

如果我不提供进度条,那么它会继续下载 –

回答

4

CURLOPT_PROGRESSFUNCTION预计回调函数将返回0值,目前您的函数返回void。如果修改progress_bar函数以返回int而不是void并将return 0;添加到它的末尾以解决问题。

相关问题