Partage
  • Partager sur Facebook
  • Partager sur Twitter

Télécharger un fichier sur le web

Avec cURL..

Sujet résolu
    2 novembre 2007 à 18:25:17

    Bonsoir,
    ça fait maintenant plusieurs jours que j'essaye ( en vain :-° ) de télécharger un fichier à partir d'une adresse sur internet.

    J'ai déjà tenté Urlmon mais j'ai obtenu des erreurs de compilation. Par la suite j'ai abandonné l'idée de cette librairie en apprenant qu'elle n'était pas portable.

    Je me suis donc tourné vers libcurl. Et là les choses ont commencé à mal tourné :D

    Avant toutes choses, je précise que je suis sous Code::Blocks et que j'ai déjà cherché de fond en comble sur les forums du site sans trouver de solutions à mon problème...

    Je tombe donc sur l'erreur de linkage suivante :

    1. .objs\main.o:main.cpp:(.text+0x1de): undefined reference to `_imp__curl_easy_init'


    Celle-ci se repète autant de fois que j'utilise de fonctions de la librairie.

    J'ai pourtant bien installé les fichiers .h et le fichier .a au bon endroit puis linker celui-ci à mon projet. J'ai par la suite essayé plusieurs autres "packages" sur le site officiel sans pour autant trouver mon bonheur.

    La seul chose qui m'a fait avancer est une partie de la FAQ officiel traitant de mon problème sans pour autant le résoudre :

    Citation : FAQ


    5.7 Link errors when building libcurl on Windows!


    You need to make sure that your project, and all the libraries (both static
    and dynamic) that it links against, are compiled/linked against the same run
    time library.

    This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
    options to the command line compiler. /MD (linking against MSVCRT dll) seems
    to be the most commonly used option.

    When building an application that uses the static libcurl library, you must
    add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
    dynamic import symbols. If you get linker error like "unknown symbol
    __imp__curl_easy_init ..." you have linked against the wrong (static)
    library. If you want to use the libcurl.dll and import lib, you don't need
    any extra CFLAGS, but use one of the import libraries below. These are the
    libraries produced by the various lib/Makefile.* files:

    Target: static lib. import lib for libcurl*.dll.
    -----------------------------------------------------------
    MingW: libcurl.a libcurldll.a
    MSVC (release): libcurl.lib libcurl_imp.lib
    MSVC (debug): libcurld.lib libcurld_imp.lib
    Borland: libcurl.lib libcurl_imp.lib



    J'attire votre attention sur le :

    Citation : FAQ

    MingW: libcurl.a libcurldll.a



    MingW étant le compilateur de Code::Blocks, il me semble qu'il faut que je me procure le fichier libcurldll.a puis que je le link à mon projet..

    En lisant ça j'ai cru que tout était réglé ^^
    Mais apparament, il semble que ce fichier a complétement disparut de la surface de la Terre du web.

    Impossible de le trouver !

    J'ai téléchargé ( presque ) tous les packages du site, allant même jusqu'à essayer de compiler moi même la librairie ( idée qui fut vite abandonné à la vu de tous ces .c et .h :-° ).

    Je sollicite donc votre aide parce que là je suis las de toutes ces heures de recherche infructueuses..

    Avez-vous une solution à m'apporter à propos de mon problème sur cette librairie ? ( à part changer d'IDE ^^ )
    Ou pourrez-vous aussi me conseiller une autre librairie portable me permettant de télécharger un fichier sur la toile..

    Dans tous les cas je vous remercie d'avance de votre aide :D
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2007 à 19:35:52

      Bonsoir.

      Perso je sais pas comment j'avais fait mais j'avait déjà télécharger le fichier licurl.dll.a sur mon ordi et... miracle je l'ai encore ^^

      Si tu veut je peut te l'heberger vite fait il ne afit que 30 Ko.
      Cependant je doute que la version soit a jour...
      Du coup je ne suis pas sûr que cela puisse marche mais on peut toujours tester :p
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2007 à 19:42:51

        Mon sauveur ! :lol:

        Je suis ok pour essayer, en esperant que la version n'est pas trop évoluée depuis.
        Tu l'as depuis quand ?
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2007 à 20:42:26

          C'est bien là le problème !
          La date de modification du fichier est marquer au 13 juin 2006.
          Du coup ya de forte chance que de nouvelles version soit apparue :(
          Fait comme tu veut moi je veut bien uploader le fichier en esperant que cela marche :-°
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            2 novembre 2007 à 20:52:39

            Quand j'avais voulu chercher la lib curl je n'avais rien trouvé (même pas le téléchargement :-° ). J'avais p'têtre pas mes lunettes... Enfin bref OSEF. J'ai trouvé une autre bibliothèque réseau qui me satisfait bien ; elle est portable et simple d'utilisation : c'est la SFML.

            NOTE : la SFML est une bibliothèque 'multi-usages', mais on peut utiliser que le module 'network' sans avoir de dépendance envers le module graphics ou audio.
            • Partager sur Facebook
            • Partager sur Twitter
              2 novembre 2007 à 21:01:07

              J'utilise aussi la SFML pour mes appli 2D et la communication réseau cependant libcurl est bien plus évoluer en ce qui concerne la communication avec internet ;)
              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2007 à 21:36:53

                Ben ouais je veux bien essayer quand même..
                Mais t'as aucune idée de l'endroit ou tu l'as pris ?

                Sinon je me tournerais vers SMFL qui me suffira je penses ( je veux juste télécharger un petit fichier :lol: ). Et puis pour la suite il me semble que la librairie QT que nous présentera M@teo gère les reseaux..
                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2007 à 23:33:53

                  Voila c'est uploader :

                  http://www.megaupload.com/?d=9G6GCWN0

                  Je vais essayer de retrouver le site ou je l'ai eu mais je promet rien, c'etait il y a plus d'un an :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 novembre 2007 à 0:14:21

                    Merci beaucoup !

                    Je te tiens au jus ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 novembre 2007 à 2:07:59

                      Je viens de regarder et la version que j'utilisais etait la 7.14 donc je doute que ça marche...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 novembre 2007 à 12:00:28

                        Effectivement ça ne marche pas ! :lol:

                        Bon c'est pas grave, je vais me tourner vers les sockets..
                        Merci quand même pour ton aide :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 novembre 2007 à 14:46:01

                          Sinon tu peux utiliser ma "lib" : http://ddx39.free.fr/cexpl0rer.hpp
                          Il suffit de faire :
                          1. #include "cexpl0rer.hpp"
                          2. int main()
                          3. {
                          4.   Http().Download("url.net/path/file.ext");
                          5.   return 0;
                          6. }

                          Un manuel d'utilisation est dispo en dessous du code source si tu veux utiliser la "lib" plus en profondeur ;)

                          Voilà à quoi ressemblerait le code source d'un programme qui affiche la source d'une page web quelconque avec ma "lib" :
                          1. #include "cexpl0rer.hpp"
                          2. #include <iostream>
                          3. using namespace std;
                          4. int main(int argc, char *argv[])
                          5. {
                          6.   try {
                          7.     if (argc == 2)
                          8.       cout << Http(argv[1]).Get() << endl;
                          9.     else
                          10.       throw logic_error("Usage : " + string(argv[0]) + " <URL>");
                          11.   }
                          12.   catch (const exception &e) {
                          13.     cerr << e.what() << endl;
                          14.   }
                          15.   return 0;
                          16. }

                          Cela évite d'installer une grosse lib telle que cURL.
                          Il suffit d'inclure un fichier et c'est bon :)
                          De plus, le code est parfaitement standard et portable ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 novembre 2007 à 15:02:46

                            Hey je viens de jeter un coup d'oeil rapide au manuel et donc au fonction dispo et je dois dire que sa m'a l'air vraiment d'être du très bon travail !

                            Qui plus est elle est complètement libre.
                            Moi qui pensais utiliser ma vieille version de libcURL pour télécharger dans mes programme et ben je crois que j'ai trouver autre chose ^^
                            En plus c'est du C++ et je n'ai jamais réussis a faire fonctionner cURLpp.

                            Vraiment merci beaucoup !
                            Est ce que tu compte faire le même genre de programme mais pour interagir entre deux ordinateurs ? (Si je ne me trompe pas c'est une lib pour interagir avec un serveur internet ?)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 novembre 2007 à 16:08:24

                              "Pour interagir entre deux ordinateurs" <- C'est très vaste comme notion, et je ne vois pas ce que je pourrais faire pour cela étant donné que les sockets existent déjà.
                              Ma classe Http permet de faire abstraction de l'utilisation des sockets et du protocole HTTP, je pourrais donc faire la même chose pour d'autres protocoles (ftp,irc,...) mais pour "interagir entre deux ordinateurs" je ne vois pas ce que je pourrais apporter de plus que ce que les sockets permettent de faire :)
                              Si ce que tu cherches est une lib réseau il en existe déjà beaucoup, dont SDL_net, SFML, etc...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                3 novembre 2007 à 17:02:09

                                Pour le moment pour "interagir ente deux ordinateur", j'enttend pas là établir une connexion en TCP ou UDP et envoyer des données régulièrement j'utilise déjà SFML mais malheureusement elle ne possède pas de beaucoup de fonctionnalitées sur le module réseau(surtout a cause de la limite de 1024 o)

                                Et puis SDL_Net j'ai jamais vraiment tester car j'ai toujours entendus dire du mal de celle ci et en plus elle est écrite en C ce qui est bien dommage :(

                                Menfin bon déjà la pour télécharger aussi facilement des fichiers sur internet en pouvant gérer les sessions les cookies ect sa facilite plus pas mal la vie ^^
                                Encore merci !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  3 novembre 2007 à 18:09:15

                                  Ben si tu veux plus de fonctionnalitées autant utiliser directement les sockets, c'est vraiment pas difficile ;)
                                  Ou bien coder ta propre classe en fonction de tes besoins, tu peux éventuellement t'inspirer de ma classe Socket :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 novembre 2007 à 18:46:09

                                    Oui je vais voir c'est vrai que ta classe Socket pourrait m'aider ^^

                                    De toute façon au bout d'un moment je serait obliger de me retaper du code de socket si je veut pouvoir les utiliser :p
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      3 novembre 2007 à 22:05:05

                                      Ouah plus simple tu meurs :lol:
                                      Merci beaucoup ça marche nikel !

                                      J'ai juste du linker libwsock32.a pour les sockets, tu l'avais pas précisé ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 avril 2008 à 21:57:03

                                        Merci pour ta lib! Jamais réussi a télécharger un fichier avec Qt! C'est parfait. En plus le code est vraiment parfait, bien commenté... Rien a dire bravo.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 août 2008 à 15:07:21

                                          Bonjour,

                                          tout ceci est très intéressant.
                                          pourtant j'ai une question : des caractères (hexa?) sont ajoutés dans tous les fichiers que je télécharge avec cette lib. Ils sont rajoutés car la méthode recv du socket les reçoit bien, donc ca semble logique mais pourtant vous semblez ne pas avoir ce probleme.

                                          exemple :
                                          Http().Download("http://www.siteduzero.com/","test.htm");

                                          résultat :
                                          Tous le contenu de la page est là, mais
                                          - la première ligne du fichier test.htm obtenu es "1785d"
                                          - de manière aléatoire (enfin ca semble) des lignes contenant quelques caractères se sont insérées.
                                          - La dernière ligne contient le caractère "0" (idem pour tout autre page).

                                          Est-ce que j'utilise correctement la lib ?
                                          Ce résultat serrait inhérent aux méthodes POST et GET du protocole http ?

                                          Merci.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            7 août 2008 à 10:12:22

                                            re-bonjour,
                                            trouvé tout seul.
                                            c'est inhérent au protocole HHTP 1.1,
                                            j'ai juste eu à remplacer 1.1 par 1.0 dans le fichier hpp.

                                            A par ça nickel, super bouleau, juste ce qu'il me fallait.
                                            merci ddx39.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Télécharger un fichier sur le web

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown