Ikkilik ma'lumot va fayllar

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);

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.

Blob o'zgarmas (immutable) obyekt. Uning ichidagi ma'lumotni to'g'ridan-to'g'ri o'zgartira olmaysiz โ€” indeks orqali bayt yozish mumkin emas. Lekin Blobni bo'laklab undan yangi Blob yasash mumkin (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:

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
Har bir 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:

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