atob
ফাংশন বাইনারি ডেটা প্রতিটি বাইট জন্য একটি অক্ষর দিয়ে একটি নতুন স্ট্রিং মধ্যে একটি Base64- এনকোডেড স্ট্রিং ডিকোড হবে।
const byteCharacters = atob(b64Data);
প্রতিটি অক্ষরের কোড পয়েন্ট (চারকোড) বাইটের মান হবে। .charCodeAt
স্ট্রিংয়ের প্রতিটি অক্ষরের জন্য পদ্ধতিটি ব্যবহার করে আমরা বাইট মানগুলির একটি অ্যারে তৈরি করতে পারি ।
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
আপনি বাইট মানগুলির এই অ্যারেটি Uint8Array
কনস্ট্রাক্টরকে পাস করে একটি প্রকৃত টাইপড বাইট অ্যারে রূপান্তর করতে পারেন ।
const byteArray = new Uint8Array(byteNumbers);
পরিবর্তে এটিকে একটি অ্যারেতে মুড়িয়ে এবং এটিতে পাস করে একটি বিএলওবিতে রূপান্তর করা যায় Blob
নির্মাণকারীর ।
const blob = new Blob([byteArray], {type: contentType});
উপরের কোডটি কাজ করে। তবে byteCharacters
একবারে না হয়ে বরং ছোট ছোট ফালিগুলিতে প্রক্রিয়াজাতকরণের মাধ্যমে কিছুটা উন্নতি করা যেতে পারে । আমার মোটামুটি পরীক্ষায় 512 বাইট ভাল স্লাইস আকার বলে মনে হচ্ছে। এটি আমাদের নিম্নলিখিত ফাংশন দেয়।
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;
সম্পূর্ণ উদাহরণ:
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);