2012-12-20 13 views
5

Sto provando a caricare un'immagine sul server web remoto. Ho usato HTMLForm e FilePartSource. Sono in grado di caricare correttamente l'immagine sul server locale (ad esempio il loclhost) ma quando provo a caricarlo sul server remoto, la risposta ricevuta dal server Web remoto è "411 Length Required". Ho provato a impostare request.setContentLength (sizeofimagefile) ma ancora lo stesso problema. Qualcuno può guidarmi su qual è il problema o. Ecco il mio codice.POCO: Come caricare l'immagine su webser usando poco in 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(); 

Grazie in anticipo

+0

in setContentLength (sizeofimagefile), Hai inserito la dimensione dei parametri "aaaaaa" e "cccccc" che hai inviato con l'immagine nella richiesta DataBlock? Se usi il metodo POST per il tuo modulo, questi parametri vanno allo stesso datablock dell'immagine che stai cercando di caricare. –

risposta

0

Se è possibile caricare un file sul server locale, ma non potete con il vostro server remoto, in primo luogo si dovrebbe verificare se il telecomando Apache/PHP ha un limite di upload. Prova un phpinfo() nel tuo server remoto.

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

In caso contrario, si dovrebbe rivedere il codice ...

dalla documentazione Poco, all'URL: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HtmlForm:

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

Crea un HTMLForm dalla richiesta HTTP specificata. I file caricati sono scartati in modo invisibile.

E con questo costruttore:

HtmlForm:

HtmlForm (const HTTPRequest & richiesta, std :: istream & requestBody, PartHandler & handler);

Crea un HTMLForm dalla richiesta HTTP specificata. I file caricati vengono passati al dato PartHandler.

Nel tuo esempio, quale costruttore stai applicando?

D'altra parte,

AddPart:

vuoto AddPart ( const std :: string & nome, PartSource * pSource); Aggiunge una parte/allegato (caricamento del file) al modulo. Il modulo assume la proprietà di PartSource e lo elimina quando non è più necessario.La parte verrà inviato solo se l'insieme codifica per la forma è "multipart/form-data"

tenta di utilizzare "multipart/form-data" con AddPart e il secondo costruttore per HtmlForm.

Se non funziona, provare a utilizzare uno sniffer di rete come Wireshark per verificare cosa si sta inviando.

Verificare se l'intestazione Content-Length della richiesta, ha il sizeof (immagine) + sizeof ("aaaaaa" e "cccccc" parametri). Oppure prova a inviare il modulo con metodo GET anziché con POST.

Fammi sapere se funziona.

saluti

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

Il codice non è in grado di assegnare i dati del modulo nell'oggetto richiesta. Quindi quando chiamate session.sendRequest, una richiesta vuota viene inviata al server. Per eseguire correttamente la conversione di HTMLForm in HTTPRequest, è necessario scrivere in questo modo:

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

Il codice di caricamento delle immagini, che sta lavorando per me è -

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

Il server di upload corrispondente sta usando il codice PHP standard per il caricamento di file form HTML.