2012-12-20 7 views
5

hochladen Ich versuche, ein Bild auf Remote-Webserver hochladen. Ich habe HTMLForm und FilePartSource verwendet. Ich bin in der Lage, Image auf lokalen Server (d. H. Loclhost) erfolgreich zu laden, aber wenn ich versuche, es auf Remote-Server hochladen, ist die Antwort von Remote-Webserver "411 Länge erforderlich". Ich habe versucht, request.setContentLength (sizeofimagefile) aber immer noch das gleiche Problem zu setzen. Kann mir jemand sagen, was das Problem ist oder. Hier ist mein Code.POCO: Wie Bild auf Webser mit 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(); 

Vielen Dank im Voraus

+0

in setContentLength (sizeofimagefile), Haben Sie die Größe der Parameter "aaaaaa" und "cccccc", die Sie mit Ihrem Bild im Request dataBlock senden, eingeschlossen? Wenn Sie die POST-Methode für Ihr Formular verwenden, werden diese Parameter an denselben Datenblock gesendet wie das Bild, das Sie hochladen möchten. –

Antwort

0

Wenn Sie eine Datei auf dem lokalen Server hochladen können, aber nicht mit dem Remote-Server, sollten Sie zunächst überprüfen, ob Ihr Remote Apache/PHP Upload-Limit hat. Versuchen Sie eine phpinfo() auf Ihrem Remote-Server.

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

Wenn nicht, können Sie Ihren Code ...

Von Poco Dokumentation, unter der URL überarbeiten sollte: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

Htmlform:

Htmlform (const HTTPRequest & Anfrage, Std :: iStream & AnfrageBody);

Erstellt ein HTMLForm aus der angegebenen HTTP-Anfrage. Hochgeladene Dateien sind still verworfen.

Und mit diesem Konstruktor:

Htmlform:

Htmlform (const Httprequest & Anfrage, std :: istream & requestBody, PartHandler & handler);

Erstellt ein HTMLForm aus der angegebenen HTTP-Anfrage. Hochgeladene Dateien werden an den angegebenen PartHandler übergeben.

In Ihrem Beispiel, welchen Konstruktor bewerben Sie?

Auf der anderen Seite,

addPart:

Leere addPart ( const std :: string & Name, PartSource * pSource); Fügt dem Formular einen Teil/Anhang (Datei-Upload) hinzu. Das Formular übernimmt das Eigentum der PartSource und löscht es , wenn es nicht mehr benötigt wird.Das Teil wird nur, wenn die Codierung gesendet wird Sets für die Form „Multipart/form-data“

Try „Multipart/form-data“ mit addPart und dem zweiten Konstruktor für Htmlform zu verwenden.

Wenn es nicht funktioniert, versuchen Sie, einen Netzwerk-Sniffer wie Wireshark zu verwenden, um zu überprüfen, was Sie senden.

Überprüfen Sie, ob Content-Length-Header Ihrer Anfrage, haben Sie die Größe von (Ihr Bild) + sizeof ("aaaaaa" und "cccccc" params). Oder versuchen Sie, Ihr Formular mit GET-Methode anstelle von POST zu senden.

Lassen Sie mich wissen, ob es funktioniert.

Grüße

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

Ihr Code ist nicht in der Lage Formulardaten in das Request-Objekt zuweisen. Wenn Sie also session.sendRequest aufrufen, wird eine leere Anfrage an den Server gesendet. Um eine korrekte Konvertierung von HTMLForm in HTTPRequest durchzuführen, müssen Sie folgendermaßen schreiben:

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

Der Bild-Upload-Code, der für mich arbeitet, ist -

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

Der entsprechende Upload-Server zum Hochladen von HTML-Formular-Dateien Standard-PHP-Code verwendet.