2012-08-11 47 views
0

我想使用POCO :: Net :: HTMLForm上传图片到appengine。 请参阅下面的代码。我有的问题是图像数据不发送。令牌和角色名称(其用于开源动作RPG)没有任何问题。任何想法我可能做错了什么?使用Poco发送图像到网络服务器

感谢提前:)

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; 

的Python处理程序的AppEngine:

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") 

回答

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格式的文件。

0

我希望图象 - 数据显示为后场,而不是得到的,所以我会尝试imagedata = self.request.post("imagedata")。或者,尝试将其发布到服务器上,这将允许您设置断点并检查请求的内容。