C++ 卷曲文件下载 - 错误检查

C++ Curl file download - error check

本文关键字:错误 检查 文件下载 C++      更新时间:2023-10-16

我使用以下函数从服务器下载文件。

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 & @Daniel Stenberg

>curl_easy_perform()返回描述结果的CURLcode。RTFM:


  • CURLE_HTTP_RETURNED_ERROR如果CURLOPT_FAILONERROR设置为 TRUE,并且 HTTP 服务器返回的错误代码为>= 400,则返回此值。

您需要查看 res 的值。有关所有可能的值,请参阅 curl 错误代码。如果 res 等于 CURLE_REMOTE_FILE_NOT_FOUND ,则该文件可能不可用。您还可以使用 CURLOPT_ERRORBUFFER 从 curl 获取错误消息。

如果 res 始终为 0(说CURLE_OK会更精确),那么在支持许多协议的 curl 级别上,一切可能都很好。错误在 HTTP 级别。您无法解决服务器返回的内容,但是您可以获取HTTP状态代码:服务器可能返回404代码以及"找不到文件"消息。请参阅带有 libcurl 的 Http 状态代码?学习如何使用 libcurl 来做到这一点。如果可以直接使用 curl 程序,可以先使用 curl -I http://servera.com/filea.tar.gz 查看终端中的 HTTP 答案。