The atob
fungsi 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 .charCodeAt
metode 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 Uint8Array
konstruktor.
const byteArray = new Uint8Array(byteNumbers);
Ini pada gilirannya dapat dikonversi ke BLOB dengan membungkusnya dalam sebuah array dan meneruskannya ke Blob
konstruktor.
const blob = new Blob([byteArray], {type: contentType});
Kode di atas berfungsi. Namun kinerjanya dapat ditingkatkan sedikit dengan memproses byteCharacters
irisan 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);