2012-01-14 18 views
3

私はPocoを使用してC++でHTTPクライアントを作成しており、サーバーがjpegイメージコンテンツ(バイト単位)で応答を送信する状況があります。レスポンスを処理し、それらのバイトからjpgイメージファイルを生成するにはクライアントが必要です。Poco C++を使用してHTTPサーバーの応答から画像コンテンツを読み取る方法は?

私は、適切な機能のためのポコライブラリを検索するが、私はいずれかを発見していません。それを行う唯一の方法は手動であるようです。

これは私のコードの一部です。応答を受け取り、入力ストリームを画像コンテンツの先頭で開始させます。

/* 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'); 

どのように進めますか?

答えて

-8

ホイールを改造しないでください。 HTTPを正しく行うのは難しいです。 libcurlなどの既存のライブラリを使用します。

+6

私は車輪の再発明はありません、私はポコを使用しています。 –

+0

Leif、PocoにHTTPライブラリが含まれていて、それを使用している場合、Content-Lengthを解析する必要はありません。 –

+0

手動で解析せずにPocoでContent-Lengthを見つける方法がわかっている場合は、なぜそれが何であるか教えてください。 –

2

以下は、応答本文を文字列として取得するコードです。また、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

これを正しく動作させるためにバイナリで書き出す必要がありました:outfile.open( "myfile.jpg"、ios_base :: binary); – ryatkins

+0

@ryatkinsさんは窓にいますか? – Homer6

+0

はい、Windowsの場合。私のイメージのダウンロードは壊れていました。これはWindows固有のものだと思いますか? – ryatkins

関連する問題