2012-12-20 75 views
5

我想上傳圖像到遠程web服務器。我用過HTMLForm和FilePartSource。我能夠成功地將圖像上傳到本地服務器(即loclhost),但是當我嘗試在遠程服務器上傳圖像時,從遠程網絡服務器收到的響應是「需要411長度」。 我試圖設置request.setContentLength(sizeofimagefile),但仍然是同樣的問題。 任何人都可以指導我什麼是問題或。 這是我的代碼。POCO:如何上傳圖像到webser使用poco在c + +

HTMLForm htmlform; 
htmlform.set("aaaaaa", "bbbbbbb"); 
htmlform.set("cccccc", "ddddddd"); 
htmlform.setEncoding(HTMLForm::ENCODING_MULTIPART); 

PartSource * pFileSrc = new FilePartSource("filename", "application/octet-stream"); 

std::istream& mystream = pFileSrc->stream(); 
mystream.seekg(0, std::ios::end); 
int uiLength = mystream.tellg(); 

    htmlform.addPart("file", pFileSrc); 

URI uri("yyy"); 

    HTTPClientSession session(uri.getHost(), uri.getPort());   
HTTPRequest post_req(Poco::Net::HTTPRequest::HTTP_POST,"xxx",HTTPMessage::HTTP_1_1);   
post_req.setKeepAlive(true); 
htmlform.prepareSubmit(post_req); 


std::ostream& oustr = session.sendRequest(post_req); 
htmlform.write(oustr); 

HTTPResponse res; 
std::istream& rs = session.receiveResponse(res); 

std::cerr << rs.rdbuf(); 

在此先感謝

+0

in setContentLength(sizeofimagefile),您是否包含您在請求dataBlock中與圖像一起發送的參數「aaaaaa」和「cccccc」的大小?如果您爲表單使用POST方法,則這些參數會轉到與您嘗試上載的圖像相同的數據塊。 –

回答

0

如果你可以上傳文件到您的本地服務器,但不能與遠程服務器,首先你應該檢查一下你的遙控阿帕奇/ PHP有一個上傳限制。在您的遠程服務器上嘗試phpinfo()。

http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/

如果沒有,你應該修改你的代碼...

從波科文檔,在URL: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HtmlForm控件:

HtmlForm控件(常量HTTPRequest &請求,std :: istream & requestBody);

根據給定的HTTP請求創建HTMLForm。 上傳的文件是 默默丟棄

而與此構造:

HtmlForm控件:

HtmlForm控件(常量的HTTPRequest &請求,性病:: istream的& requestBody,PartHandler &處理程序);

根據給定的HTTP請求創建HTMLForm。 上傳的文件被傳遞給給定的PartHandler

在你的例子中,你應用了什麼構造函數?

在另一方面,

addPart:

無效addPart( 常量的std :: string &名, PartSource *的PSource);向表單添加零件/附件(文件上載)。該表格取得了PartSource的所有權,並在不再需要時將其刪除 。部分將只發送如果用於形式 編碼集是「多部分/格式數據」

嘗試使用「多部分/格式數據」與addPart和用於HtmlForm控件第二構造函數。

如果它不起作用,請嘗試使用Wireshark等網絡嗅探器來檢查您發送的內容。

檢查您的請求的Content-Length頭是否有sizeof(您的圖片)+ sizeof(「aaaaaa」和「cccccc」參數)。或嘗試使用GET方法而不是POST發送表單。

讓我知道它是否有效。

問候

4
std::ostream& oustr = session.sendRequest(post_req); 
htmlform.write(oustr); 

您的代碼不能表單數據分配到所述請求對象。所以當你調用session.sendRequest時,一個空的請求被髮送到服務器。爲了正確地將HTMLForm轉換爲HTTPRequest,你必須這樣寫 -

htmlform.write(session.sendRequest(post_req));

這是爲我工作的圖片上傳代碼 -

HTTPRequest request(HTTPRequest::HTTP_POST, "/fileupload/upload_file.php", HTTPMessage::HTTP_1_1); 
    HTMLForm form; 
    form.setEncoding(HTMLForm::ENCODING_MULTIPART); 
    form.set("entry1", "value1"); 
    form.set("entry2", "value2"); 
    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格式的文件。