2014-01-29 11 views
5

Ich versuche, eine Bilddatei (gif) aus der Antwort eines HTTP-Servers zu speichern, aber die Datei wird nicht korrekt gespeichert.boost: asio. Bilddatei vom Server herunterladen

Ich benutze den syncronous Code Beispiel von der Boost-Webseite, und ich bekomme eine Datei, aber ist nicht die gleiche Datei, die Sie in einem Webbrowser sehen können. Siehe Original-Datei hier (WMS-Server): http://demo.lizardtech.com/lizardtech/iserv/ows?SERVICE=WMS&REQUEST=GetMap&LAYERS=LACounty,&STYLES=&BBOX=314980.5,3624089.5,443200.5,3861209.5&SRS=EPSG:26911&FORMAT=image/gif&HEIGHT=300&WIDTH=600

Ich habe verschiedene Dinge ausprobiert, aber niemand arbeitet. Ich bekomme eine Datei, aber ist nicht die gleiche Datei. Weißt du wo/was ist das Problem? Vielen Dank.

#include <fstream> 
#include <string> 
#include <boost/asio.hpp> 

using namespace std; 
using namespace boost::asio; 
using boost::asio::ip::tcp; 

void GetFile(const std::string& serverName, 
          const std::string& getCommand, 
          std::ofstream& outFile) 
{ 
    boost::asio::io_service io_service; 

    // Get a list of endpoints corresponding to the server name. 
    tcp::resolver resolver(io_service); 
    tcp::resolver::query query(serverName, "http"); 
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
    tcp::resolver::iterator end; 

    // Try each endpoint until we successfully establish a connection. 
    tcp::socket socket(io_service); 
    boost::system::error_code error = boost::asio::error::host_not_found; 
    while (error && endpoint_iterator != end) 
    { 
    socket.close(); 
    socket.connect(*endpoint_iterator++, error); 
    } 

    boost::asio::streambuf request; 
    std::ostream request_stream(&request); 

    request_stream << "GET " << getCommand << " HTTP/1.0\r\n"; 
    request_stream << "Host: " << serverName << "\r\n"; 
    request_stream << "Accept: */*\r\n"; 
    request_stream << "Connection: close\r\n\r\n"; 

    // Send the request. 
    boost::asio::write(socket, request); 

    // Read the response status line. 
    boost::asio::streambuf response; 
    boost::asio::read_until(socket, response, "\r\n"); 

    // Check that response is OK. 
    std::istream response_stream(&response); 
    std::string http_version; 
    response_stream >> http_version; 
    unsigned int status_code; 
    response_stream >> status_code; 
    std::string status_message; 
    std::getline(response_stream, status_message); 


    // Read the response headers, which are terminated by a blank line. 
    boost::asio::read_until(socket, response, "\r\n\r\n"); 

    // Process the response headers. 
    std::string header; 
    while (std::getline(response_stream, header) && header != "\r") 
    { 
    } 

    // Write whatever content we already have to output. 
    if (response.size() > 0) 
    { 
     outFile << &response; 
    } 
    // Read until EOF, writing data to output as we go. 
    while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) 
    { 
     outFile << &response;     
    } 
} 


int main(int argc, char* argv[]) 
{ 
    string serverName = "demo.lizardtech.com"; 

    string getCommand = "/lizardtech/iserv/ows?SERVICE=WMS&REQUEST=GetMap&"; 
    getCommand += "LAYERS=LACounty,&STYLES=&";    
    getCommand += "BBOX=314980.5,3624089.5,443200.5,3861209.5&"; 
    getCommand += "SRS=EPSG:26911&FORMAT=image/gif&HEIGHT=300&WIDTH=600"; 

    std::ofstream outFile("image.gif", std::ofstream::out, std::ofstream::binary); 

    GetFile(serverName, getCommand, outFile); 

    outFile.close(); 

    return 0; 
} 
+0

Haben Sie versucht, die Größe und den Inhalt der richtigen Datei und der Datei, die Sie verwalten, zu vergleichen? Bist du dir sicher, dass dein 'header! =" \ R "' test, sollte es nicht '" \ r \ n "' sein? –

Antwort

6

Es sieht aus wie Ausgabedateistream falsch konfiguriert ist. Versuchen Sie ersetzen

std::ofstream outFile("image.gif", std::ofstream::out, std::ofstream::binary); 

mit

std::ofstream outFile("image.gif", std::ofstream::out | std::ofstream::binary); 

Hinweis das zweite Komma ersetzt mit bitwase oder (|)

ich auch würde vorschlagen, bei URDL von Schöpfer der Boost-Suche :: asio. Macht solche Aufgaben viel einfacher.