The atobfungsi akan memecahkan kode string Base64 menjadi string baru dengan karakter untuk setiap byte dari data biner.
const byteCharacters = atob(b64Data);
Setiap titik kode karakter (charCode) akan menjadi nilai byte. Kita bisa membuat array nilai byte dengan menerapkan ini menggunakan .charCodeAtmetode untuk setiap karakter dalam string.
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
Anda dapat mengubah array nilai byte ini menjadi array byte yang diketik nyata dengan meneruskannya ke Uint8Arraykonstruktor.
const byteArray = new Uint8Array(byteNumbers);
Ini pada gilirannya dapat dikonversi ke BLOB dengan membungkusnya dalam sebuah array dan meneruskannya ke Blobkonstruktor.
const blob = new Blob([byteArray], {type: contentType});
Kode di atas berfungsi. Namun kinerjanya dapat ditingkatkan sedikit dengan memproses byteCharactersirisan yang lebih kecil, daripada sekaligus. Dalam pengujian kasar saya 512 byte tampaknya merupakan ukuran irisan yang baik. Ini memberi kita fungsi berikut.
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;
Contoh Lengkap:
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);