Bilddaten (binär) im CString für HTTP-Request
-
Hallo,
ich plage mich jetzt seit ungefähr 4 Stunden...
Mein Ziel ist es, einen HTTP-Request an einen Server zu schicken, der einen im HTML-Formular eingegebenen Text und ein Bild verschickt.Der Request sieht laut RFC 1867 so aus:
Content-type: multipart/form-data, boundary=AaB03x --AaB03x Content-disposition: form-data; name="eingabetext" ... Texteingabe des Benutzers ;-) --AaB03x Content-disposition: attachment; name="bild"; filename="dateiname.jpg" Content-type: image/jpeg Content-Transfer-Encoding: binary ... binärer Inhalt der Datei --AaB03x--
Mein Quellcode sieht dazu folgendermaßen aus:
CStdioFile quelldatei; CString strBuffer; quelldatei.Open(tmp, CStdioFile::modeRead|CStdioFile::typeBinary); quelldatei.ReadString(strBuffer); quelldatei.Close(); CString inhalt; inhalt.Format("--AaB03x\r\n" "Content-disposition: form-data; name=\"text\"" "\r\n\r\n%s\r\n--AaB03x\r\n" "Content-disposition: attachment; name=\"bild\"; filename=\"%s\"" "\r\nContent-type: image/jpeg\r\n" "Content-Transfer-Encoding: binary\r\n\r\n", m_strAlbum, CutDateiname(tmp)); inhalt += strBuffer; inhalt += "\r\n--AaB03x--";
Ich habe nun mehrere Möglichkeiten schon ausprobiert, dies ist meine letzte... Mein Problem war bei allen Lösungen, dass strBuffer entweder nur 4 Zeichen enthält (da in der Datei nach den ersten vier Zeichen eine 0 kommt), oder inhalt nur 4 Zeichen aus einem char-Array kopiert (da auch hier das 5 char der lIste eine 0 ist).
Nur meine erste Lösung hat bis jetzt gefruchtet. Jedes Zeichen in der Datei wird einfach an "inhalt" angehangen. Diese Variante ist allerdings bei Dateien größer 100 KB extrem Performancelastig, so dass das Programm nicht mehr reagiert. Mir ist klar warum.
Nun suche ich nach einer Möglichkeit, dass die 0er mit hinzugenommen werden.
Was mache ich falsch?
-
Hi,
ich bezweifle, das solch ein Request von irgendeinen Webserver angenommen wird.
Hast Du auch einen Header, den du an den Server schickst?
Soweit ich weiß, geht nur die GET oder POST Methode an den Server bzw. über den
Querystring (max. 2000 Zeichen URL-Encoded).
Du schickst einen MIME-Kodierten Body (Content) an den Server. Was soll dieser
damit machen? Es wäre ja ein ziemliches Sicherheitsproblem, wenn jeder einfach
so irgendwelche Binaries auf den Server hochladen könnte....
Die meisten Protokolle´(POP3/SMTP und soweit ich weiß auch HTTP) verwenden
nur Zeichen aus den ANSI-Tabellen. Ein Ansatz wäre also, die Binärdaten in
Base64 zu codieren und dann das Content-Transfer-Encoding auf base64 zu setzen.Btw. wird das File überhaupt komplett in den Speicher geladen mit ReadString?
Gruss
EB
-
erstmal danke für deine Antwort. Der Request wird vom Server angenommen, ich habe mit der ersten Variante schon einige Daten schicken und empfangen können.
Wie bekomme ich die 0 rein, ohne dass die CString-Methoden und -Operatoren danach auhören, die Zeichen zu behandeln?
-
hey EB, wo steht das mit den 2000 Zeichen maximal?
-
@jemandanderes
Laut RFC gibt es kein Limit, aber ein Server kann´ein zu langen Querystring
mit einen Fehler ablehnen.
2000 ist daher ein recht guter Richtwert, wenn man sich verschiedene Implementierungen ansieht.
z.B.: http://www.aspfaq.com/show.asp?id=2222@Maiktmp
Wie gesagt, kannst Du dein Byte-Array in Base64 Kodieren, oder Binär von Plattte lesen und direkt in ein BYTE-Buffer schreiben und dann den BYTE Buffer
senden statt einen String.
Ob du dann ein Array von Bytes sendest (BYTE = typedef unsigned char)
oder einen LPCTSTR ( wenn nicht UNICODE dann LPCTSTR = typedef const char*)
ist dasselbe, wenn wir mal das Vorzeichen weglassen.Gruss
EB
-
danke für deinen Tip EB,
manchmal sieht man die Variable vor lauter Klassen nichtIch habe es nun mit einem Byte-Feld gelöst.
Schöne Nacht noch,
Maik