使用Poco将图像发送到网络服务器

时间:2012-08-11 11:40:42

标签: c++ http poco-libraries

我正在尝试使用POCO :: Net :: HTMLForm将图片上传到appengine。 请参阅下面的代码。我遇到的问题是imagedata没有发送。令牌和角色名称(用于开源动作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")

2 个答案:

答案 0 :(得分:0)

我希望imagedata显示为post字段而不是get,所以我会尝试imagedata = self.request.post("imagedata")。或者尝试将其发布到服务器,该服务器允许您设置断点并检查请求的内容。

答案 1 :(得分: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);

相应的上传服务器使用标准PHP代码上传HTML表单文件。