Hakuna matata!
Wenn es da doch nur irgendwas vorgefertigtes gäbe… lass mal überlegen… FormData vielleicht?
Na klar. FormData kannst du auch nehmen, da wirds halt ein POST:
xhr.open("POST", "", true); xhr.send(my_form_data_object);
Aber: FormData kennt nur Schlüssel-Werte-Paare, allenfalls bei mehreren gleichnamigen Parametern entsteht serverseitig ein Array. Die Daten sind nicht weiter strukturiert, sie sind nur aneinandergehängt.
Wenn Du z.B. einem Bild eine Beschreibung und einen Titel hinzufügen willst, werden das weitere Parameter, die in keiner Beziehung zum Bild stehen, das kannst Du nur infolge einer Vereinbarung der Parameternamen festlegen.
Kompakter wäre sowas:
> REQUEST = {
> cv => {
> bin: ArrayBuffer,
> type: 'application/pdf',
> title: 'Lebenslauf',
> descr: 'Eine glückliche Jugend im Zeichen der Technik'
> },
> person: {
> name: String,
> vname: String,
> pp: Blob,
> type: 'image/jpeg'
> },
> addr: {},
> control: {
> register: 1
> }
> // usw.
> }
>
Und das geht eben nicht mit FormData. Beachte den Schlüssel 'control', da steht drin, was mit den im Objekt gesendeten Daten serverseitig gemacht werden soll. Solche Strukturen schaffen Transparenz, das Objekt hast Du quasi 1:1 client- wie serverseitig. Transparenz: Die Übertragung, der Transport ist durchsichtig. Es lohnt sich, darüber nachzudenken, weil es die Sache letztendlich sehr einfach und skalierbar macht. Was fehlt, sind kompatible Serializer, für oben gezeigte Objekt-Stuktur habe ich mir einen entwickelt, der damit erzeugte Dateien zwischen Perl und JavaScript kompatibel macht. Funktionierende Beispiele gibts auf meiner Site.
Schönes Wochenende.
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.