C ++ Curl文件下载 - 错误检查

时间:2016-02-23 11:50:29

标签: c++ curl libcurl

我正在使用以下功能从服务器下载文件。

void downloadFile(const char* url, const char* fname) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    curl = curl_easy_init();
    if (curl){
        fp = fopen(fname, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
}

使用方法如下:

downloadFile("http://servera.com/filea.tar.gz","filea.tar.gz");

如何在此中添加错误检查,因此如果filea.tar.gz不可用或无法访问servera.com,我可以显示所选的错误消息。

更新 我添加了:

cout << res;代码,但这总是返回0

服务器返回“未找到文件”消息并正在下载。无论如何围绕这个?如果找不到或无法访问指定的文件,我想收到错误..谢谢

更新 以下是现在显示的人类可读错误消息:

void downloadFile(const char* url, const char* fname) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    curl = curl_easy_init();
    if (curl){
        fp = fopen(fname, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
        res = curl_easy_perform(curl);
        cout << curl_easy_strerror(res);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
}

现在我可以得到错误代码,我应该能够更好地捕获它。感谢@YSC&amp; @Daniel Stenberg

2 个答案:

答案 0 :(得分:3)

curl_easy_perform()返回描述结果的CURLcodeRTFM

  • CURLE_HTTP_RETURNED_ERROR
    如果CURLOPT_FAILONERROR设置为TRUE且HTTP服务器返回错误代码&gt; = 400,则会返回此信息。

答案 1 :(得分:0)

您需要查看$scope.makeUrl = function() { console.log("Called"); x= 'https://en.wikipedia.org/w/api.php?action=query&format=json&maxlag=10&prop=&list=&meta=&titles=' + $scope.queryText; console.log(x); return x; } $scope.searchArticle = function(url) { console.log(url); $http.get(url) .then(onArticleReceived, onArticleError); } 的值。有关所有可能的值,请参阅curl error codes。如果res等于res,则该文件可能不可用。您还可以使用CURLOPT_ERRORBUFFER从curl获取错误消息。

如果res始终为0(说CURLE_OK会更精确),那么一切都可能在支持许多协议的curl级别上运行良好。错误发生在HTTP级别。您无法解决服务器返回的问题,但是您可以获取HTTP状态代码:服务器可能返回404代码以及“找不到文件”消息。请参阅Http status code with libcurl?以了解如何使用libcurl执行此操作。如果您可以直接使用curl程序,可以先使用CURLE_REMOTE_FILE_NOT_FOUND查看终端中的HTTP答案。