Blob
Blob (Binary Large Object โ ikkilik katta obyekt) โ brauzerdagi ikkilik ma'lumotni tasvirlash uchun mo'ljallangan obyekt. ArrayBufferdan farqi shundaki, Blob nafaqat baytlarni, balki ularning turini (MIME type, masalan image/png) ham saqlaydi. Aynan shu tur Blobni fayl sifatida yuklab olish yoki rasm sifatida ko'rsatishga imkon beradi. Blob โ brauzer obyekti, shuning uchun quyidagi misollar brauzer muhitiga oid.
Blob konstruktori
Blob ikkita argument bilan yaratiladi: bo'laklar (blobParts) massivi va sozlamalar obyekti:
let blob = new Blob(blobParts, options);
blobPartsโ massiv bo'lib, uning elementlariString,ArrayBuffer,TypedArray,DataViewyoki boshqaBlobbo'lishi mumkin โ barchasi ketma-ket birlashtiriladi;optionsโ ixtiyoriy obyekt; asosiy xususiyatitypeโ Blob ma'lumotining MIME turi (masalantext/plain,image/png).
Matndan Blob yaratamiz:
// matnli bo'laklardan Blob yasaymiz
let blob = new Blob(["Salom, ", "dunyo!"], { type: "text/plain" });
console.log(blob.size); // 13 (baytlar soni)
console.log(blob.type); // text/plain
size โ Blobdagi baytlar soni, type โ uning MIME turi. E'tibor bering: bo'laklar avtomatik birlashtiriladi, xuddi bitta uzluksiz ma'lumotdek.
slice).ArrayBufferdan Blob
Blobni faqat matndan emas, ikkilik ma'lumotdan ham yasash mumkin. Masalan, TypedArray yordamida:
// ikkilik baytlardan Blob
let bytes = new Uint8Array([72, 101, 108, 108, 111]); // Hello
let blob = new Blob([bytes], { type: "application/octet-stream" });
console.log(blob.size); // 5
Bu usul rasm, audio yoki boshqa ikkilik ma'lumotni fayl formatida qadoqlashda ishlatiladi.
slice bilan bo'laklash
blob.slice(start, end, contentType) โ Blobning bir qismidan yangi Blob qaytaradi. Xuddi massiv sliceiga o'xshaydi:
startโ boshlang'ich bayt indeksi (standarti 0);endโ tugash bayti (kirmaydi, standarti oxirigacha);contentTypeโ yangi Blobning MIME turi (standarti bo'sh).
let blob = new Blob(["Hello world"], { type: "text/plain" });
let qism = blob.slice(0, 5); // dastlabki 5 bayt
console.log(qism.size); // 5
// qism ichida "Hello" saqlanadi
slice katta fayllarni bo'laklab yuklashda (chunked upload) juda qo'l keladi. Katta faylni bir necha Blob bo'lakka bo'lib, har birini alohida serverga jo'natish mumkin.URL.createObjectURL: Blobga havola
Blobni brauzerda ko'rsatish yoki yuklab olish uchun unga URL kerak. URL.createObjectURL(blob) Blobga ishoruvchi maxsus qisqa havola yaratadi (blob: bilan boshlanadi):
let blob = new Blob(["Fayl mazmuni"], { type: "text/plain" });
let url = URL.createObjectURL(blob);
console.log(url);
// blob:https://example.com/1e8b4a2c-...
// bu URLni <a href> yoki <img src>da ishlatish mumkin
URL.createObjectURL chaqiruvi brauzer xotirasida Blobga ishora saqlaydi. Blob bu ishora tirik ekan, xotiradan tozalanmaydi โ bu xotira sizishiga (memory leak) olib keladi. Ishlatib bo'lgach, albatta URL.revokeObjectURL(url) chaqiring.let url = URL.createObjectURL(blob);
// ... url ishlatildi ...
URL.revokeObjectURL(url); // xotirani bo'shatamiz
Faylni yuklab olish
Blob va object URL yordamida foydalanuvchiga faylni yuklab olishni taklif qilish mumkin. Buning uchun <a> elementiga download atributini qo'yamiz va uni dasturiy bosamiz:
function faylniYuklab(matn, faylNomi) {
let blob = new Blob([matn], { type: "text/plain" });
let url = URL.createObjectURL(blob);
let a = document.createElement("a");
a.href = url;
a.download = faylNomi; // yuklab olinadigan fayl nomi
document.body.appendChild(a);
a.click(); // dasturiy bosamiz
document.body.removeChild(a);
URL.revokeObjectURL(url); // tozalaymiz
}
faylniYuklab("Salom, dunyo!", "salom.txt");
download atributi mavjud bo'lsa, brauzer havolani ochish o'rniga faylni yuklab oladi. Atribut qiymati โ taklif qilinadigan fayl nomi. Bu usul serverga murojaat qilmasdan, mijoz tomonda fayl yaratishning eng oddiy yo'li.Blobni rasmga aylantirish
Blobning katta ustunligi โ undan bevosita rasm ko'rsatish mumkin. Object URLni <img>ga bersangiz kifoya:
// masalan, fetch orqali kelgan rasm Blob'i
let response = await fetch("rasm.png");
let blob = await response.blob();
let img = document.createElement("img");
img.src = URL.createObjectURL(blob);
document.body.appendChild(img);
// rasm yuklangach URLni tozalash
img.onload = () => URL.revokeObjectURL(img.src);
Teskari yo'nalish ham mumkin: <canvas> tarkibini canvas.toBlob(callback, type) orqali Blobga aylantirib, so'ng yuklab olish yoki serverga jo'natish mumkin:
canvas.toBlob(function(blob) {
let url = URL.createObjectURL(blob);
let a = document.createElement("a");
a.href = url;
a.download = "rasm.png";
a.click();
URL.revokeObjectURL(url);
}, "image/png");
canvas.toBlob asinxron (callback bilan), canvas.toDataURL esa sinxron va base64 satr qaytaradi. Katta rasmlar uchun toBlob tejamkorroq, chunki base64 ma'lumotni ~33% ga kattalashtiradi.Blob va ArrayBuffer o'zaro
Blob va past darajali ArrayBuffer o'rtasida oson o'tish mumkin. Blobdan baytlarni olish uchun uning metodlari ishlatiladi:
await blob.arrayBuffer()โ Blob mazmuniniArrayBufferko'rinishida qaytaradi;await blob.text()โ Blob mazmunini matn (UTF-8) sifatida qaytaradi;blob.stream()โ Blobni o'qish oqimi (ReadableStream) sifatida beradi.
let blob = new Blob(["Hello"], { type: "text/plain" });
let buffer = await blob.arrayBuffer();
let bytes = new Uint8Array(buffer);
console.log(bytes[0]); // 72 (H)
let matn = await blob.text();
console.log(matn); // Hello
Xulosa
Blobโ ikkilik ma'lumot + MIME turini saqlovchi brauzer obyekti;new Blob(parts, {type})โ satr, ArrayBuffer, TypedArray yoki boshqa Bloblardan yasaladi;blob.sizevablob.typeโ asosiy xususiyatlar; Blob o'zgarmas;blob.slice(...)โ bo'laklash (masalan chunked upload uchun);URL.createObjectURL(blob)โ Blobgablob:havola;revokeObjectURLbilan tozalash shart;downloadatributi bilan fayl yuklab olish,<img>ga URL berib rasm ko'rsatish mumkin;blob.arrayBuffer(),blob.text()โ Blobdan past darajali ma'lumotga o'tish.