2012-12-20 25 views
5

Poco kullanarak webser için görüntü nasıl yüklenir Uzak web sunucusuna bir görüntü yüklemeye çalışıyorum. HTMLForm ve FilePartSource kullandım. Görüntüyü yerel dosyaya (örn. Loclhost) başarıyla yükleyebildim, ancak uzak sunucuya yüklemeye çalıştığımda, uzak web sunucusundan alınan yanıt "411 Length Required". request.setContentLength (sizeofimagefile) ayarlamayı denedim ama yine de aynı sorun. Sorunun ne olduğu konusunda bana rehberlik edebilir mi? İşte kodum. peşinPOCO: C++

+0

setContentLength (sizeofimagefile), Request dataBlock öğesindeki resminizle gönderdiğiniz "aaaaaa" ve "cccccc" params'larının boyutunu dahil ettiniz mi? Formunuz için POST yöntemini kullanırsanız, bu param yüklemeleri, yüklemeye çalıştığınız resmin aynı veritabanına gider. –

cevap

0

yılında

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(); 

sayesinde yerel sunucuya bir dosya yükleyebilirsiniz, ancak uzak Apache/PHP bir yükleme sınırını varsa uzak sunucu ile öncelikle kontrol etmelisiniz yapamıyorsanız. Uzak sunucunuzda bir phpinfo() deneyin. Değilse, kodunuzu gözden geçirmeliyiz

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

...

Poco belgelerine bakıldığında, URL adresinden

: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HtmlForm:

HtmlForm (const HTTPRequest & istek, std :: istream & requestBody);

Verilen HTTP isteğinden bir HTMLForm oluşturur. Karşıya yüklenen dosyalar sessizce atılır. ;

HtmlForm (const HTTPRequest & istek, std :: istream & requestBody, PartHandler & işleyici):

HtmlForm:

Ve bu kurucu ile

Verilen HTTP isteğinden bir HTMLForm oluşturur. Yüklenen dosyalar, verilen PartHandler'a iletilir.

Örneğinizde Ne kurucu uyguluyorsunuz? Öte yandan

,

addPart:

geçersiz addPart ( const std :: string & isim, PartSource * pSource); Forma bir parça/ek (dosya yükleme) ekler. Form, PartSource'un sahipliğini alır ve artık gerekmediğinde onu siler.kısım sadece form için kodlama grubu "çok parçalı/form-" addPart ve HtmlForm ikinci kurucu ile "parçalı/formu verilerini" kullanımı

deneyin ise gönderilecektir.

Çalışmıyorsa, ne gönderdiğinizi kontrol etmek için Wireshark gibi bir ağ algılayıcı kullanmayı deneyin.

İsteğinizin İçerik Uzunluğu başlığının olup olmadığını kontrol edin, sizeof (resminiz) + sizeof ("aaaaaa" ve "cccccc" params). Veya formunuzu POST yerine GET yöntemiyle göndermeyi deneyin.

Çalışırsa bana bildirin.

Selamlar

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

Kodunuz isteği nesnesine form verilerini atamak mümkün değildir. Yani, session.sendRequest öğesini çağırdığınızda, sunucuya boş bir istek gönderilir. HTTPRequest için HtmlForm uygun bir dönüşüm yapmak için, bu gibi yazmak gerekir -

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

benim için çalışıyor resim yükleme kodudur -

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

gelen yükleme sunucusu HTML formu dosya yükleme için standart PHP kodu kullanıyor.

İlgili konular