-
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 : )
-
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());
-
Eh oui ! J'oubliais que fprintf était faite pour écire du texte : /
Merci de ta réponse ça marche impec maintenant ^^
-
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
-
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 ?
-
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;
}
-
Et comme ça ?
std::ofstream file("logo.jpg", std::ios::binary);
-
En effet ça marche, merci bien.
-
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;
-
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 ?
-
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...
-
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?
-
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.
-
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?
-
Parce que là la problème c'est que même en entrant manuellement cette adresse je n'accède pas à l'image...
-
Par suivre que veux tu dire?
Juste extraire la chaîne de caractère correspondant à l'adresse de l'image non?
Oui. SFML ne gère pas du tout les réponses HTTP particulières comme les redirections. C'est donc à toi de les interpréter si tu en as besoin. Mais si ici tout ce qui t'intéresse est l'URL finale de ton image, alors on s'en fiche un peu.
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
Oui. Sauf qu'elle ne semble pas donner grand chose.
-
Bon apprement pour accéder à l'image,
le serveur est: http://eoliserv.eo.esa.int
pas de port spécifié
et l'URI est : /browse/cgi-bin/M2BS_URLproc.cgi?/8011/ASARz0IM/ASA_IM__0P/ENVISAT_1/20070813T111134260-20070813T111154120_D_B-XI0B.jpg
Soit au final un mix des deux, je ne comprend pas très bien comment cela s'achemine.