Ich habe diese Frage schon oft gestellt, aber so viel ich versuche, sehe ich immer noch keine Ergebnisse:
Wie kann ich einen Blob anfügen, um Daten zu bilden und ihn über jquery zu posten?
%Vor%Alle Nicht-Blob-Schlüssel / Werte befinden sich in der Anfrage und sogar der Schlüssel des Blobs ... aber nicht die Blob-Daten.
Interessanterweise bekomme ich, wenn ich Firefox statt Chrome verwende, ein wenig Daten dort oben ... aber nicht viel (das sollten bis zu 2 MB Daten sein ... das sind 7 Bytes)
Ich bin kürzlich auf genau dieses Problem gestoßen und habe die Lösung.
Das Kernproblem ist, dass der Wert von reader.result
, der an reader.onload
von readAsBinaryString
übergeben wurde, eine Zeichenfolge und kein Blob ist. Klingt offensichtlich, aber ich habe auch angenommen, dass ich mit einem Blob arbeite. Da String- und Blob-Objekte beide eine Slice-Methode haben, ist die Variable slice
, obwohl sie mit Daten gefüllt ist, die wie Binärdaten aussehen, immer noch nur eine Zeichenkette. Die Methode String.slice () funktioniert genauso wie die Methode Blob.slice () und ignoriert nur den dritten Parameter, weshalb Sie nicht bemerken, was wirklich passiert.
Gemäß der FormData-Spezifikation eines beliebigen Werts, der kein Blob- oder File-Objekt ist wird in eine Zeichenfolge konvertiert. Es sieht so aus, als ob die Zeichenfolge slice
beim ersten Nicht-ASCII-Zeichen gekürzt wird (ich vermute nur den genauen Grund, aber der wichtige Punkt ist, dass die Zeichenfolge definitiv abgeschnitten wird, wenn sie an formdata
angefügt wird) .
Die Lösung besteht darin, zuerst reader.result
in einen Blob umzuwandeln:
(Das Array ist eine Voraussetzung für den Blob-Konstruktor).
Nun ist slice
ein Blob, da die Methode Blob.slice () ein Blob-Objekt zurückgibt und an formdata
angehängt werden kann, ohne durch die String-Konvertierung gestört zu werden.