Die atob
Funktion decodiert eine Base64-codierte Zeichenfolge in eine neue Zeichenfolge mit einem Zeichen für jedes Byte der Binärdaten.
const byteCharacters = atob(b64Data);
Der Codepunkt jedes Zeichens (charCode) ist der Wert des Bytes. Wir können ein Array von Bytewerten erstellen, indem wir dies mit der .charCodeAt
Methode für jedes Zeichen in der Zeichenfolge anwenden .
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
Sie können dieses Array von Bytewerten in ein real typisiertes Byte-Array konvertieren, indem Sie es an den Uint8Array
Konstruktor übergeben.
const byteArray = new Uint8Array(byteNumbers);
Dies kann wiederum in ein BLOB konvertiert werden, indem es in ein Array eingeschlossen und an den Blob
Konstruktor übergeben wird.
const blob = new Blob([byteArray], {type: contentType});
Der obige Code funktioniert. Die Leistung kann jedoch ein wenig verbessert werden, indem die byteCharacters
in kleineren Scheiben anstatt auf einmal verarbeitet werden. In meinem groben Test scheinen 512 Bytes eine gute Slice-Größe zu sein. Dies gibt uns die folgende Funktion.
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);
window.location = blobUrl;
Vollständiges Beispiel:
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const contentType = 'image/png';
const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);
const img = document.createElement('img');
img.src = blobUrl;
document.body.appendChild(img);