FormData-Objekt per POST
Das hat mich gerade einige Zeit gekostet, hab's mit Chrome nicht zum Laufen gebracht. Der meinte immer, er solle ein File senden und das wäre verboten.Also mach ich es hübsch zu Fuß:
Vor einiger Zeit habe ich das hier mal aufgeschrieben, was es mit dem Enctype="multipart/form-data" auf sich hat. Die Parts sind einfach aneinandergehängt und das sieht so aus:
-----------------------------14430236131380
Content-Disposition: form-data; name="name"
Lastname
-----------------------------14430236131380
Content-Disposition: form-data; name="vname"
Firstname
-----------------------------14430236131380
Content-Disposition: form-data; name="file"; filename="blob"
Content-Type: text/plain; charset=UTF-8
Firstname Lastname
-----------------------------14430236131380--
Zu sehen ist die Boundary, welche die Komponenten trennt. Jetzt betrachte mal die letzte Komponente, die nämlich zeigt, dass ein Upload stattgefunden hat: Während die ersten Beiden Parts nur Parameter(name, vname) = Wert (Lastname, Firstname) haben, steht in der letzten Komponente (Part) noch ein weiterer Parameter: filename="blob", welcher infolge der Verwendung des FormData-Objekts
formData.append('file', new Blob([data], { type: 'text/plain; charset=UTF-8' }));
hinzugefügt wird. Wobei: name="file" habe ich selbst vergeben, filename="blob" jedoch fügt das FormData-Objekt hinzu (Default). Aufgrunddessen und nur deswegen ist der Inhalt laut name="file" serverseitig in $_FILES zu finden. Aus dem Enctype="multipart/form-data" wird beim Senden mit POST der Request-Header Content-Type: multipart/form-data und wenn Du Dir auf meiner Demo-Site diesen Header anschaust, ist da auch die Boundary mit dabei. Letzteres ist wichtig, damit der serverseitige Parser die einzelnen Komponenten wiederherstellen kann.
In PHP ist der Part in $_File zu finden, in Perl erstellt CGI.pm aus dem Parameter name="file" ein Dateihandle auf eine temporäre Datei. Der Name des Parameters lautet im Beispiel "file" der kann natürlich auch anders lauten.
Es ist zugegebendermaßen etwas verwirrend (den Header Content-Type gibt es auch in der Response, jedoch mit einer völlig anderen Bedeutung), aber ich habe mir das nicht ausgedacht. Es steht in einschlägigen RFCs, zum eigenen Verständnis einfach mal machen.
Schöne Grüße.