LESEN SIE MINDESTENS DEN ERSTEN PARA HIER!
Ich weiß, dass dies 3 Jahre zu spät ist, aber Matts (akzeptierte) Antwort ist unvollständig und wird Sie schließlich in Schwierigkeiten bringen. Der Schlüssel hier ist, dass, wenn Sie sich für die Verwendung entscheiden multipart/form-data
, die Grenze nicht in den Dateidaten erscheinen darf , die der Server schließlich empfängt.
Dies ist kein Problem application/x-www-form-urlencoded
, da es keine Grenze gibt. x-www-form-urlencoded
kann auch immer mit Binärdaten umgehen, indem einfach ein beliebiges Byte in drei 7BIT
Bytes umgewandelt wird. Ineffizient, aber es funktioniert (und beachten Sie, dass der Kommentar, dass Dateinamen und Binärdaten nicht gesendet werden können, falsch ist; Sie senden ihn einfach als ein weiteres Schlüssel / Wert-Paar).
Das Problem dabei multipart/form-data
ist, dass das Grenztrennzeichen nicht in den Dateidaten vorhanden sein darf (siehe RFC 2388 ; Abschnitt 5.2 enthält auch eine ziemlich lahme Entschuldigung dafür, dass kein geeigneter aggregierter MIME-Typ vorhanden ist, der dieses Problem vermeidet).
Also, auf den ersten Blick, multipart/form-data
ist von keinem Wert in haupt jede Datei - Upload, binär oder auf andere Weise. Wenn Sie Ihre Grenze nicht korrekt wählen, dann Sie wird schließlich ein Problem haben, ob Sie Text oder Raw - Binary sind zu senden - der Server eine Grenze an der falschen Stelle finden, und die Dateien werden abgeschnitten oder POST wird versagen.
Der Schlüssel besteht darin, eine Codierung und eine Grenze so zu wählen, dass Ihre ausgewählten Grenzzeichen nicht in der codierten Ausgabe erscheinen können. Eine einfache Lösung ist die Verwendung base64
(nicht nicht Raw - Binary verwenden). In base64 werden 3 beliebige Bytes in vier 7-Bit-Zeichen codiert, wobei der Ausgabezeichensatz [A-Za-z0-9+/=]
(dh alphanumerisch, '+', '/' oder '=') ist. =
ist ein Sonderfall und wird möglicherweise nur am Ende der codierten Ausgabe als Einzel- =
oder Doppelausgabe angezeigt ==
. Wählen Sie nun Ihre Grenze als 7-Bit-ASCII-Zeichenfolge, die in der base64
Ausgabe nicht angezeigt werden kann. Viele Auswahlmöglichkeiten, die Sie im Internet sehen, schlagen diesen Test fehl - das MDN bildet DokumenteVerwenden Sie beispielsweise "blob" als Grenze beim Senden von Binärdaten - nicht gut. Allerdings so etwas wie "! Blob!" wird niemals in der base64
Ausgabe erscheinen .