0

POCO::Net::HTMLForm を使用して画像を appengine にアップロードしようとしています。以下のコードを参照してください。私が抱えている問題は、画像データが送信されないことです。トークンとキャラクター名(オープンソースのアクションRPG用)は問題なく送信されます。私が間違っているかもしれない何か考えはありますか?

前もって感謝します :)

C++ コード:

            // prepare session
        Poco::URI uri(backend_url + "/api/update_character_avatar");
        Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());

        // prepare path
        std::string path(uri.getPathAndQuery());
        if (path.empty()) path = "/";

        Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, path);
        Poco::Net::HTMLForm form;
        form.add("token", sw_token);
        form.add("charname", sw_charname);

        Poco::Buffer<char> imgBuffer(mImgPtr->size());
        mImgPtr->read(imgBuffer.begin(), imgBuffer.end()-imgBuffer.begin());
        std::string s(imgBuffer.begin(), mImgPtr->size());

        std::ostringstream out;
        Poco::Base64Encoder b64enc(out);
        b64enc.write(imgBuffer.begin(), imgBuffer.end()-imgBuffer.begin());
        b64enc.close();
        Poco::Net::StringPartSource *prtsrc = new Poco::Net::StringPartSource(out.str());
        form.addPart("imagedata", prtsrc);

        form.prepareSubmit(req);
        std::ostream& send = session.sendRequest(req);
        form.write(send);

        // get response
        Poco::Net::HTTPResponse res;

        // print response
        std::istream &is = session.receiveResponse(res);
        std::ostringstream stream;
        Poco::StreamCopier::copyStream(is, stream);
        std::cout << stream.str() << std::endl;

appengine の Python ハンドラ:

class UpdateCharacterAvatarHandler(webapp2.RequestHandler):
def post(self):
    token = self.request.get("token")
    charname = self.request.get("charname")
    imagedata = self.request.get("imagedata")

    logging.error(self.request.body)

    self.response.write("test")
4

2 に答える 2

0

imagedata は get ではなく post フィールドとして表示されると予想されるので、試してみ     imagedata = self.request.post("imagedata")ます。または、ブレークポイントを設定してリクエストの内容を検査できるサーバーに投稿してみてください。

于 2012-09-30T20:25:24.020 に答える
0

申し訳ありませんが、このコードで何をしようとしているのか正確に理解できませんでした。HTMLForm クラスを使用するだけでファイルをアップロードできるため、ファイルをアップロードするために取った無駄な手順がたくさんあります。これを行うために必要な最小限のコードは次のとおりです-

    HTTPRequest request(HTTPRequest::HTTP_POST, "/fileupload/upload_file.php",    HTTPMessage::HTTP_1_1);
    HTMLForm form;
    form.setEncoding(HTMLForm::ENCODING_MULTIPART);
    form.addPart("file", new FilePartSource("/home/abc/Pictures/sample.png"));
    form.prepareSubmit(request);

    HTTPClientSession *httpSession = new HTTPClientSession("localhost");
    httpSession->setTimeout(Poco::Timespan(20, 0));
    form.write(httpSession->sendRequest(request));        

    Poco::Net::HTTPResponse res;
    std::istream &is = httpSession->receiveResponse(res);
    Poco::StreamCopier::copyStream(is, std::cout);

対応するアップロード サーバーは、HTML フォーム ファイルのアップロードに標準の PHP コードを使用しています。

于 2014-02-06T11:47:17.573 に答える