2012-08-11 100 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")。或者,嘗試將其發佈到服務器上,這將允許您設置斷點並檢查請求的內容。