Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [sf::Http] télécharger une image  (Lu 7472 fois)

0 Membres et 1 Invité sur ce sujet

Glaucos.

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
[sf::Http] télécharger une image
« le: Août 03, 2012, 07:00:13 pm »
Bonjour,

en regardant les tutoriels j'ai trouvé la classe sf::Http très facile d'utilisation pour télécharger rapidement des pages webs. Cependant je n'arrive pas à télécharger du contenu comme des images par exemple. Pourtant le code ne devrait pas changer non ? Méthode GET, et url de l'image à télécharger ? Voici mon code:


    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <SFML/System.hpp>
    #include <SFML/Network.hpp>

    using namespace std;

    int main()
    {
        sf::Http http;
        http.SetHost("http://www.sfml-dev.org");

        sf::Http::Request Request;
        Request.SetMethod(sf::Http::Request::Get);
        Request.SetURI("/images/logo.jpg");

        sf::Http::Response Response = http.SendRequest(Request);

        std::string Body = Response.GetBody();

        cout << Body << endl;

        FILE *save = fopen("logo.jpg", "w");
        fprintf(save, "%s", Body.c_str());
        fclose(save);

        return 0;
    }
 

Merci de vos réponses : )

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #1 le: Août 03, 2012, 08:43:41 pm »
Le problème c'est ça :
        FILE *save = fopen("logo.jpg", "w");
        fprintf(save, "%s", Body.c_str());
        fclose(save);

Deux erreurs :
- tu utilises fprintf, qui est fait pour sortir du texte, alors que tu as un tableau d'octets bruts ("body" n'est pas réellement une chaîne de caractères)
- tu utilises des fonctions C de gestion de chaînes de caractères, qui s'arrêtent donc au premier 0 rencontré (il doit y en avoir un paquet dans l'image téléchargée)

Solution :
- utiliser du vrai C++
- ne pas traiter "body" comme une chaîne de caractères, mais comme un tableau d'octets

std::ofstream file("logo.jpg", std::ios::binary);
file.write(Body.c_str(), Body.size());
« Modifié: Novembre 18, 2012, 09:04:53 am par Laurent »
Laurent Gomila - SFML developer

Glaucos.

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #2 le: Août 04, 2012, 10:17:43 am »
Eh oui ! J'oubliais que fprintf était faite pour écire du texte : / 
Merci de ta réponse ça marche impec maintenant ^^

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [sf::Http] télécharger une image
« Réponse #3 le: Novembre 17, 2012, 04:58:46 pm »
Je me permet de up, car chez moi cela ne fonctionne pas... Le fichier reçu n'est pas ouvrable, windows me dit qu'il est corrompu...
Merci

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #4 le: Novembre 17, 2012, 06:42:03 pm »
Tu l'as comparé avec le fichier original pour essayer de voir ce qui n'allait pas ?

Tu peux nous montrer le bout de code correspondant ?
Laurent Gomila - SFML developer

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [sf::Http] télécharger une image
« Réponse #5 le: Novembre 17, 2012, 06:55:22 pm »
A première vu le fichier téléchargé est légèrement plus lourd.
    #include <iostream>
#include <fstream>
    #include <SFML/System.hpp>
    #include <SFML/Network.hpp>

    using namespace std;

    int main()
    {
        sf::Http http;
        http.setHost("http://www.sfml-dev.org");

        sf::Http::Request Request;
        Request.setMethod(sf::Http::Request::Get);
        Request.setUri("/images/logo.jpg");

        sf::Http::Response Response = http.sendRequest(Request);

        std::string Body = Response.getBody();

        cout << Body << endl;

        std::ofstream file("logo.jpg");
file.write(Body.c_str(), Body.size());

        return 0;
    }
 
« Modifié: Juillet 03, 2014, 12:39:32 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #6 le: Novembre 17, 2012, 09:36:52 pm »
Et comme ça ?

std::ofstream file("logo.jpg", std::ios::binary);
Laurent Gomila - SFML developer

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [sf::Http] télécharger une image
« Réponse #7 le: Novembre 18, 2012, 07:33:59 am »
En effet ça marche, merci bien.

FranckPano

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #8 le: Juillet 03, 2014, 12:31:54 pm »
Bonjour,
Désolé de encore une fois re-up ce sujet.
J'ai le même problème, l'image est corrompu, illisible:
"Erreur d'interprétation du fichier d'image JPEG (Not a JPEG file: starts with 0x3c 0x21)",
Pourtant, j'ai ajouté le paramètre à la ligne comme dans la dernière aide. Voici le code:

std::cout << "-Début requêtes Http-" << std::endl;
sf::Http http;
http.setHost("http://www.sfml-dev.org");

sf::Http::Request request;
request.setMethod(sf::Http::Request::Get);
request.setUri("/images/logo.jpg");

sf::Http::Response response = http.sendRequest(request);

std::string Body = response.getBody();

std::cout << Body << std::endl;

std::ofstream file("imageRecup.jpg", std::ios::binary);
file.write(Body.c_str(), Body.size());

std::cout << "-Fin requêtes Http-" << std::endl;
« Modifié: Juillet 03, 2014, 12:33:26 pm par FranckPano »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #9 le: Juillet 03, 2014, 12:42:29 pm »
Puisque tu affiches le contenu récupéré, tu vois vien que c'est du code HTML et non une image JPEG. Et tu vois sans doute aussi que ce code HTML est celui de la page d'erreur 404. Donc tu en déduis que ton URL d'image n'existe pas, chose que tu peux aisément vérifier en la tapant dans ton navigateur.

Non ?
Laurent Gomila - SFML developer

FranckPano

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #10 le: Juillet 03, 2014, 12:48:59 pm »
Tout juste.

Le problème c'est qu'à la base c'est cette image là que j'essaye de récupérer:
http://eoliserv.eo.esa.int/browse/cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg

Donc le code devient:

std::cout << "-Début requêtes Http-" << std::endl;
sf::Http http;
http.setHost("http://eoliserv.eo.esa.int");

sf::Http::Request request;
request.setMethod(sf::Http::Request::Get);
request.setUri("/browse/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg");

sf::Http::Response response = http.sendRequest(request);

std::string Body = response.getBody();

std::cout << Body << std::endl;

std::ofstream file("imageRecup.jpg", std::ios::binary);
file.write(Body.c_str(), Body.size());

std::cout << "-Fin requêtes Http-" << std::endl;

Et là, même problème...

FranckPano

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #11 le: Juillet 03, 2014, 12:50:35 pm »
Si je reprends ce que tu m'as dis, c'est encore du code HTML. Donc je dois extraire l'adresse exacte de l'image et la remplacer dans la requête c'est bien ça?

Pour être plus clair:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://m2eos.eo.esa.int:8090/cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg">here</a>.</p>
<hr>
<address>Apache/2.2.3 (Red Hat) Server at eoliserv.eo.esa.int Port 80</address>
</body></html>
 

Ceci est la sortie de "Body". Donc la réelle adresse de l'image est:

http://m2eos.eo.esa.int:8090/cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg

c'est bien ça?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #12 le: Juillet 03, 2014, 12:54:48 pm »
Oui c'est ça. Là tu as récupéré une page de redirection, qu'il faut donc suivre pour obtenir l'image que tu veux.
Laurent Gomila - SFML developer

FranckPano

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #13 le: Juillet 03, 2014, 12:57:44 pm »
Par suivre que veux tu dire?
Juste extraire la chaîne de caractère correspondant à l'adresse de l'image non?

De plus, dans cette adresse:
http://m2eos.eo.esa.int:8090/cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg

Le serveur est : http://m2eos.eo.esa.int
Le port: 8090
et l'URI: /cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg

Est-ce bien ça?
« Modifié: Juillet 03, 2014, 01:15:05 pm par FranckPano »

FranckPano

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : [sf::Http] télécharger une image
« Réponse #14 le: Juillet 03, 2014, 01:37:46 pm »
Parce que là la problème c'est que même en entrant manuellement cette adresse je n'accède pas à l'image...