libcurl 404检测

zom*_*bor 5 c++

我在我的c ++程序中使用libcurl进行文件下载.如何检测请求是否为404,而不是写入文件?代码是:

    void GameImage::DownloadImage(string file_name) {
    string game_name;
    game_name = file_name.substr(file_name.find_last_of("/")+1);

    CURL *curl;
    FILE *fp;
    CURLcode res;
    string url = "http://site/"+game_name+".png";
    string outfilename = file_name+".png";
    cout<<"INFO; attempting to download "<<url<<"..."<<endl;
    curl = curl_easy_init();
    if (curl) {
        cout<<"INFO; downloading "<<url<<"..."<<endl;
        fp = fopen(outfilename.c_str(), "wb");
        cout<<"INFO; trying to open "<<outfilename<<" for file output"<<endl;
        if (fp != NULL) {
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, GameImage::WriteData);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
            curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
            curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
            res = curl_easy_perform(curl);

            long http_code = 0;
            curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);

            curl_easy_cleanup(curl);
            fclose(fp);
        }
        else {
            cout<<"GameImage::DownloadImage; Couldn't open output file"<<endl;
        }
    }
}

size_t GameImage::WriteData(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}
Run Code Online (Sandbox Code Playgroud)

我可以在传输发生后删除404响应,但最好不保存响应.

Ale*_*lex 5

你可以对照 CURLE_HTTP_RETURNED_ERROR

如果CURLOPT_FAILONERROR设置为true并且 HTTP 服务器返回错误代码为 ,则返回此值>= 400。您无法获取特定的 HTTP 响应代码,但应该足以完成您想要的操作。