web-dev-qa-db-fra.com

Télécharger le fichier en utilisant libcurl en C / C ++

Je construis une application (sur Windows avec Dev-C++) et je veux qu'elle télécharge un fichier. Je fais cela en utilisant libcurl (j'ai déjà installé le code source en utilisant packman). J'ai trouvé un exemple de travail ( http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local- répertoire-en-c-using-libcurl / ), mais il ne ferme pas le fichier une fois le téléchargement terminé. J'aimerais que quelqu'un donne un exemple sur la façon de télécharger un fichier, en c ou en c ++. Merci d'avance!

54
user197967

L'exemple que vous utilisez est faux. Voir la page de manuel de easy_setopt . Dans l'exemple, write_data utilise son propre fichier FILE, * outfile, et non le fp spécifié dans CURLOPT_WRITEDATA. C'est pourquoi la fermeture de fp pose des problèmes - elle n'est même pas ouverte.

C’est plus ou moins ce à quoi cela devrait ressembler (pas de libcurl disponible ici pour tester)

#include <stdio.h>
#include <curl/curl.h>
/* For older cURL versions you will also need 
#include <curl/types.h>
#include <curl/easy.h>
*/
#include <string>

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    char *url = "http://localhost/aaa.txt";
    char outfilename[FILENAME_MAX] = "C:\\bbb.txt";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"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);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

Mis à jour: comme suggéré par @rsethc types.h et easy.h ne sont plus présents dans les versions actuelles de cURL.

194
fvu

Pour les personnes intéressées, vous pouvez éviter d'écrire une fonction personnalisée en passant NULL en dernier paramètre (si vous n'avez pas l'intention de faire un traitement supplémentaire des données renvoyées).
Dans ce cas, la fonction interne par défaut est utilisée.

Détails
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA

Exemple

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    FILE *fp;
    CURLcode res;
    char *url = "http://stackoverflow.com";
    char outfilename[FILENAME_MAX] = "page.html";
    curl = curl_easy_init();                                                                                                                                                                                                                                                           
    if (curl)
    {   
        fp = fopen(outfilename,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }   
    return 0;
}
21
Petar