[C/C++] Http POST File

posi90

Erfahrenes Mitglied
Hallo,

Ich möchte mehrere FILEs auf einen Server laden. Da es mir nur erlaubt ist über ein sehr eingeschränktes HTTP Webinterface Dateien hochzuladen, habe ich es ich C/C++ fast fertig realisiert.

Über den Browser gesnifft sehen die Packets eines Uploads folgender Maßen aus:

Code:
Send: Return Code: 0x00000000
POST ... HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; de) Presto/2.10.229 Version/11.61
Host: ...
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: de-AT,de;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Referer: ...
Cookie: ASPSESSIONIDQSTRSARB=JIMNHHCBIDABIEOFLKFGMJED; gesperrt=alle|direction=asc|rdo_keinFilter=checked|rdo_rh_bez=checked|
Connection: Keep-Alive
Content-Length: 16863
Content-Type: multipart/form-data; boundary=----------SVGCWTfxlxZIMwQSpaWDfO



Send: Return Code: 0x00000000
------------SVGCWTfxlxZIMwQSpaWDfO
Content-Disposition: form-data; name="__VIEWSTATE"

/wEPDwUKMTI0NTA2ODE5Nw9kFgJmD2QWBAIBD2QWAgIBDxYCHglpbm5lcmh0bWwFDE11bHRpLVVwbG9hZGQCBQ8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YRYCAgEPZBYSZg9kFgJmDxAPFgQeCENzc0NsYXNzBQdoaW53ZWlzHgRfIVNCAgJkZBYBZmQCAg9kFgJmDxBkZBYAZAIEDxYCHgdWaXNpYmxlaBYCAgEPEA8WBB4EVGV4dAUOQXV0b3NrYWxpZXJ1bmceB0NoZWNrZWRnZGRkZAIFDxYCHwRoFgICAQ8QDxYEHwUFGFByb3BvcnRpb25lbiBiZWliZWhhbHRlbh8GZ2RkZGQCBg8WAh8EaBYCAgEPEA8WAh8FBQ1CaWxkIHN0cmVja2VuZGRkZAIHDxYCHwRoFgICAQ8QDxYEHwUFHlNjaGxhZ3NjaGF0dGVuIGhpbnp1ZiZ1dW1sO2dlbh8GaGRkZGQCCA8PFgIfBQURRGF0ZWkgw7xiZXJ0cmFnZW5kZAIJDw8WAh8FBQpTY2hsaWXDn2VuZGQCCg8PFgYfAgUHaGlud2Vpcx8FBZwBPHA+PGI+R2VzYW10Z3LDtsOfZTwvYj48YnI+PHA+PGI+QWNodHVuZyE8L2I+IERpZSBHZXNhbXRncsO2w59lIGRlciBob2NoenVsYWRlbmRlbiBEYXRlaWVuIGRhcmYgZm9sZ2VuZGVuIFdlcnQgbmljaHQgw7xiZXJzY2hyZWl0ZW46PGI+IDUwIE1CICg1MTIwMCBLQik8L2I+HwMCAmRkZIk3+uj2tP7wpv5anE4HXcDgiRBN
------------SVGCWTfxlxZIMwQSpaWDfO
Content-Disposition: form-data; name="ctl00$cph_text$ctl01"

222750495
------------SVGCWTfxlxZIMwQSpaWDfO
Content-Disposition: form-data; name="ctl00$cph_text$File1"; filename="Test.pdf"
Content-Type: application/pdf

%PDF-1.4
%âãÏÓ
11 0 obj<</H[556 171]/Linearized 1/E 6413/L 15445/N 2/O 14/T 15178>>
endobj
                      
xref
11 13
0000000016 00000 n
0000000727 00000 n
0000000556 00000 n
0000000804 00000 n
0000000932 00000 n
0000001038 00000 n
0000001775 00000 n
0000002389 00000 n
0000003081 00000 n
0000003320 00000 n
0000003565 00000 n
0000003641 00000 n
0000006158 00000 n
trailer
<</Size 24/Prev 15167/Root 12 0 R/Info 10 0 R/ID[<29803daf70ae9e64e763840ef915317b><37140295968d7f43ba601f2472d04627>]>>
startxref
0
%%EOF
             
13 0 obj<</Length 93/Filter/FlateDecode/L 99/S 56>>stream
xÚb```a``ªd`f`Öaàb@

Es handelt sich dabei um einen "Multiupload" mit nur einer Datei. Der Rücksende String meiner Lösung fängt mit "HTTP/1.1 200 OK" an, von dem her besteht kein syntax Fehler. Die Datei befindet sich jedoch nicht am Server.

Folgendes verwirrt mich ein bischen:
Wofür ist das boundary und wie wird dieses generiert? (Länge?)
Der File Inhalt steht sehr merkwürdig darin. Kann man das einfach binär rüberschicken?
Im Internet habe ich etwas über MIME encoding herausgefunden, jedoch bin ich noch zu keinem Ergebnis gekommen.

Kann mir jemand ein Beispiel zeigen, wie man eine PDF Datei mit POST hochlädt?

mfg. Poseidon
 
Hi.
Es handelt sich dabei um einen "Multiupload" mit nur einer Datei. Der Rücksende String meiner Lösung fängt mit "HTTP/1.1 200 OK" an, von dem her besteht kein syntax Fehler. Die Datei befindet sich jedoch nicht am Server.

Folgendes verwirrt mich ein bischen:
Wofür ist das boundary und wie wird dieses generiert? (Länge?)
Das kannst du generieren wie du willst, du mußt nur dafür sorgen, das dieses Boundary nicht in den Daten selbst vorkommen kann.
Der File Inhalt steht sehr merkwürdig darin. Kann man das einfach binär rüberschicken?
Ja, in der Regel schon. Man kann auch base64 o.ä. kodieren, muss das dann aber im MIME Header spezifizieren.

Schau dir die entsprechenden RFCs zu MIME an.

Zeig deinen Code bzw. deinen POST Aufruf.

Gruß
 
Hi,

hab mal ein Upload-Script mit der Bash implementiert und hatte da ein ähnliches Problem. Nach langem suchen fand ich dann die Lösung für mein Problem:
Nach der Datei steht ja nochmal die Boundary diese muss aber noch mit zwei "--" danach abgeschlossen werden;

Beispiel:
Code:
-------------BOUNDARY_49324989
Content-Disposition: form-data; name="datei"; filename="bubb.txt"
Content-Type: text/plain

bla bla bla bla
daten blubb
-------------BOUNDARY_49324989--

Hat mich viel Nerven gekostet bis ich endlich das kleine Detail mit dem "--" im RFC gelesen habe ;)

Gruß,
BK
 
Zurück