Как прочитать содержимое изображения из ответа HTTP-сервера, используя Poco C ++? - PullRequest
3 голосов
/ 14 января 2012

Я пишу HTTP-клиент на C ++ с Poco, и существует ситуация, при которой сервер отправляет ответ с содержимым изображения JPEG (в байтах).Мне нужен клиент для обработки ответа и создания файла изображения jpg из этих байтов.

Я искал в библиотеке Poco соответствующие функции, но не нашел ни одной.Кажется, что единственный способ сделать это вручную.

Это часть моего кода.Он принимает ответ и запускает поток ввода в начале содержимого изображения.

    /* Get response */
    HTTPResponse res;
    cout << res.getStatus() << " " << res.getReason() << endl;

    istream &is = session.receiveResponse(res);

    /* Download the image from the server */
    char *s = NULL;
    int length;
    std::string slength;

    for (;;) {
        is.getline(s, '\n');
        string line(s);

        if (line.find("Content-Length:") < 0)
            continue;

        slength = line.substr(15);
        slength = trim(slength);
        stringstream(slength) >> length;

        break;
    }

    /* Make `is` point to the beginning of the image content */
    is.getline(s, '\n');

Как продолжить?

Ответы [ 2 ]

2 голосов
/ 24 июля 2012

Ниже приведен код для получения тела ответа в виде строки. Вы также можете записать его непосредственно в файл с ofstream (см. Ниже).

    #include <iostream>
    #include <sstream>
    #include <string>

    #include <Poco/Net/HTTPClientSession.h>
    #include <Poco/Net/HTTPRequest.h>
    #include <Poco/Net/HTTPResponse.h>
    #include <Poco/Net/Context.h>
    #include <Poco/Net/SSLManager.h>
    #include <Poco/StreamCopier.h>
    #include <Poco/Path.h>
    #include <Poco/URI.h>
    #include <Poco/Exception.h>


    ostringstream out_string_stream;

    // send request
    HTTPRequest request( HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1 );
    session.sendRequest( request );

    // get response
    HTTPResponse response;
    cout << response.getStatus() << " " << response.getReason() << endl;

    // print response
    istream &is = session.receiveResponse( response );
    StreamCopier::copyStream( is, out_string_stream );

    string response_body = out_string_stream.str();

Чтобы записать напрямую в файл, вы можете использовать это:

    // print response
    istream &is = session->receiveResponse( response );

    ofstream outfile;
    outfile.open( "myfile.jpg" );

    StreamCopier::copyStream( is, outfile );

    outfile.close();
0 голосов
/ 14 января 2012

Не изобретай велосипед. Правильно сделать HTTP сложно. Используйте существующую библиотеку, такую ​​как libcurl.

...