ArrayBuffer Ñазом з обâÑкÑами пÑедÑÑавленÑ, Ñк ÑаÑÑина JavaScript, опиÑÐ°Ð½Ñ Ð² ECMA ÑÑандаÑÑÑ.
Також в бÑаÑзеÑаÑ
, ÑпеÑиÑÑкаÑÑÑÑ File API, визнаÑено додаÑÐºÐ¾Ð²Ñ Ð²Ð¸ÑокоÑÑÐ²Ð½ÐµÐ²Ñ Ð¾Ð±âÑкÑи Ð´Ð»Ñ ÑобоÑи з даними, зокÑема Blob.
Blob ÑкладаÑÑÑÑÑ Ð· необовâÑзкового ÑÑÐ´ÐºÑ type (зазвиÑай MIME Ñип) Ñа blobParts â поÑлÑдовноÑÑÑ ÑнÑиÑ
Blob обâÑкÑÑв, ÑÑдкÑв Ñа BufferSource.
ÐÑиклад ÑинÑакÑиÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ:
new Blob(blobParts, options);
blobPartsмаÑив, Ñо може мÑÑÑиÑи знаÑÐµÐ½Ð½Ñ ÑипÑBlob/BufferSource/String.optionsнеобовâÑзковий обâÑÐºÑ Ð· влаÑÑивоÑÑÑми:typeâ ÑÑдок, Ñо дозволÑÑ Ð´Ð¾Ð´Ð°Ñи Ñип длÑBlob, пеÑеважно викоÑиÑÑовÑÑÑÑÑÑ MIME Ñип, напÑиклад,image/png,endingsâ визнаÑÐ°Ñ Ñи поÑÑÑбно пÑивеÑÑи вÑÑ Ñимволи нового ÑÑдкÑ, пÑи ÑÑвоÑеннÑBlob, Ñ Ð²ÑдповÑднÑÑÑÑ Ð´Ð¾ ÑоÑмаÑÑ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ Ð¾Ð¿ÐµÑаÑÑÐ¹Ð½Ð¾Ñ ÑиÑÑема (\r\nабо\n). Типове знаÑеннÑ"transparent"(не вноÑиÑи змÑн), але ÑкÑо поÑÑÑбно внеÑÑи змÑни, Ñо Ð½ÐµÐ¾Ð±Ñ Ñдно вказаÑи"native".
ÐапÑиклад:
// ÑÑвоÑÐµÐ½Ð½Ñ Blob з ÑÑдкÑ
let blob = new Blob(["<html>â¦</html>"], {type: 'text/html'});
// звеÑнÑÑÑ ÑвагÑ: пеÑÑим аÑгÑменÑом повинен бÑÑи маÑив [...]
// ÑÑвоÑÐµÐ½Ð½Ñ Blob з ÑипÑзованого маÑÐ¸Ð²Ñ Ñ ÑÑдкÑ
let hello = new Uint8Array([72, 101, 108, 108, 111]); // "Hello" Ñ Ð±ÑнаÑÐ½Ð¾Ð¼Ñ ÑоÑмаÑÑ
let blob = new Blob([hello, ' ', 'world'], {type: 'text/plain'});
ÐÑÑимаÑи зÑÑз з Blob можна наÑÑÑпним Ñином:
blob.slice([byteStart], [byteEnd], [contentType]);
byteStartâ поÑаÑковий байÑ, Ñипове знаÑÐµÐ½Ð½Ñ 0.byteEndâ оÑÑаннÑй Ð±Ð°Ð¹Ñ (не вклÑÑно, Ñипово до кÑнÑÑ).contentTypeâ визнаÑаÑtypeнового обâÑкÑÑ, Ñипове знаÑÐµÐ½Ð½Ñ Ð±Ñде Ñаким же, Ñк Ñ Ð¿Ð¾ÑаÑÐºÐ¾Ð²Ð¸Ñ Ð´Ð°Ð½Ð¸Ñ .
ÐÑгÑменÑи ÑÐ°ÐºÑ Ð¶ ÑамÑ, Ñк Ñ array.slice, вÑдâÑÐ¼Ð½Ñ ÑиÑла Ñеж можна викоÑиÑÑовÑваÑи.
Blob обâÑкÑи незмÑннÑÐÐ°Ð½Ñ Ð² Blob не можÑÑÑ Ð±ÑÑи змÑненими, але ми можемо зÑобиÑи зÑÑз з ÑÑ
ÑаÑÑини, ÑÑвоÑиÑи новий Blob з ниÑ
, змÑÑаÑи ÑÑ
в новий Blob Ñ Ñак далÑ.
ÐоведÑнка вÑдповÑÐ´Ð°Ñ ÑÑдкам в JavaScript: ми не можемо змÑниÑи ÑкийÑÑ Ñимвол в ÑÑдкÑ, але ми можемо ÑÑвоÑиÑи новий.
Blob Ñк URL
Blob можна викоÑиÑÑаÑи Ñк URL Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ Ð²Ð¼ÑÑÑÑ HTML ÑегÑв <a>, <img> Ñа ÑнÑиÑ
.
Blob обâÑкÑи можна легко заванÑажиÑи/виванÑажиÑи, пÑд ÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ Content-Type бÑде викоÑиÑÑано знаÑÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ type.
РозглÑнÑмо пÑоÑÑий пÑиклад. ÐÑÑÐ»Ñ ÐºÐ»ÑÐºÑ Ð½Ð° поÑиланнÑ, ви заванÑажиÑе динамÑÑно згенеÑований Blob, Ñк Ñайл з вмÑÑÑом hello world:
<!-- аÑÑибÑÑ download змÑÑÑÑ Ð±ÑаÑÐ·ÐµÑ Ð·Ð°Ð²Ð°Ð½ÑажиÑи вмÑÑÑ Ð·Ð°Ð¼ÑÑÑÑ Ð²ÑдкÑиÑÑÑ ÑÑоÑÑнки -->
<a download="hello.txt" href='#' id="link">Download</a>
<script>
let blob = new Blob(["Hello, world!"], {type: 'text/plain'});
link.href = URL.createObjectURL(blob);
</script>
ÐоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñакож можна ÑÑвоÑиÑи динамÑÑно в JavaScript Ñа ÑмÑÑÑваÑи клÑк за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ link.click(), пÑÑÐ»Ñ Ñого заванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑозпоÑнеÑÑÑÑ Ð°Ð²ÑомаÑиÑно.
ÐÑÑ Ð¿Ñиклад кодÑ, Ñо дозволÑÑ ÐºÐ¾ÑиÑÑÑваÑÑ Ð·Ð°Ð²Ð°Ð½ÑажиÑи динамÑÑно ÑÑвоÑений Blob без HTML:
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
link.href = URL.createObjectURL(blob);
link.click();
URL.revokeObjectURL(link.href);
URL.createObjectURL оÑÑимÑÑ Ð°ÑгÑменÑом Blob Ñа ÑÑвоÑÑÑ ÑнÑкалÑний URL Ð´Ð»Ñ Ð½Ñого Ñ ÑоÑмаÑÑ blob:<origin>/<uuid>.
ÐÑÑ Ñк виглÑÐ´Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ link.href:
blob:https://javascript.info/1e67e00e-860d-40a5-89ae-6ab0cbee6273
ÐÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ URL, Ñо ÑÑвоÑено за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ URL.createObjectURL, бÑаÑÐ·ÐµÑ Ð·Ð±ÐµÑÑÐ³Ð°Ñ Ð²ÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ URL â Blob. Ð¢Ð¾Ð¼Ñ ÑÐ°ÐºÑ URL коÑоÑкÑ, але дозволÑÑÑÑ Ð¾ÑÑимаÑи доÑÑÑп до Blob.
ÐгенеÑований URL, Ñазом з поÑиланнÑм на нÑого, ÑÑнÑÑ ÑÑлÑки вÑеÑÐµÐ´Ð¸Ð½Ñ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ ÑÑоÑÑнки, доки вона вÑдкÑиÑа. Це дозволÑÑ Ð¿Ð¾ÑилаÑиÑÑ Ð½Ð° Blob в ÑегаÑ
<img>, <a> або бÑдÑ-ÑÐºÐ¾Ð¼Ñ Ð¾Ð±âÑкÑÑ, Ñо оÑÑкÑÑ URL.
Ðле Ñе ÑпÑиÑинÑÑ Ð¿Ð¾Ð±ÑÑний еÑекÑ. Ðоки ÑÑнÑÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Blob Ñ Ð²ÑдобÑаженнÑ, Blob повинен залиÑаÑиÑÑ Ð² памâÑÑÑ. ÐÑаÑÐ·ÐµÑ Ð½Ðµ може вивÑлÑниÑи памâÑÑÑ, Ñо зайнÑÑа Blob.
ÐÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð°Ð²ÑомаÑиÑно оÑиÑÑÑÑÑÑÑ, коли ÑÑоÑÑнка закÑиваÑÑÑÑÑ. ТомÑ, ÑкÑо поÑÑÑбно, Ñоб заÑÑоÑÑнок довго бÑв акÑивний â оÑиÑÐµÐ½Ð½Ñ Ð¿Ð°Ð¼âÑÑÑ Ð¼Ð¾Ð¶Ðµ ÑÑапиÑиÑÑ Ð½ÐµÑкоÑо.
Ð¢Ð¾Ð¼Ñ Ð¿ÑÑÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ URL Blob бÑде залиÑаÑиÑÑ Ð² памâÑÑÑ Ð½Ð°Ð²ÑÑÑ, коли вже не поÑÑÑбен.
URL.revokeObjectURL(url) видалÑÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ Ð²Ð½ÑÑÑÑÑнÑÐ¾Ð¼Ñ Ð²ÑдобÑаженнÑ, Ñо дозволÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñи Blob (ÑкÑо Ð½ÐµÐ¼Ð°Ñ ÑнÑиÑ
поÑÐ¸Ð»Ð°Ð½Ñ Ð½Ð° нÑого) Ñ Ð·Ð²ÑлÑниÑи памâÑÑÑ.
РоÑÑаннÑÐ¾Ð¼Ñ Ð¿ÑикладÑ, ми ÑÑлеÑпÑÑмовано одÑÐ°Ð·Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñмо URL.revokeObjectURL(link.href), бо оÑÑкÑÑмо, Ñо Blob бÑде заванÑажено один Ñаз.
У попеÑеднÑÐ¾Ð¼Ñ Ð¿ÑикладÑ, з HTML поÑиланнÑм, на Ñке можна клÑкнÑÑи, ми не викликаÑмо URL.revokeObjectURL(link.href), бо Ñе зÑобиÑÑ Blob не доÑÑÑпним. ÐÑÑÐ»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Blob з вÑдобÑÐ°Ð¶ÐµÐ½Ð½Ñ URL бÑлÑÑе не ÑпÑаÑÑÑ.
Blob в base64
ÐнÑим ÑпоÑобом оÑÑимаÑи доÑÑÑп до Blob, замÑÑÑÑ URL.createObjectURL, Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Blob в base64 закодований ÑÑдок.
Це кодÑÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ Ð¿ÑедÑÑавиÑи Ð´Ð°Ð½Ñ Ñк ÑÑдок ASCII ÑимволÑв вÑд 0 до 64. Ð, Ñо найважливÑÑе, ми можемо викоÑиÑÑовÑваÑи Ñе кодÑÐ²Ð°Ð½Ð½Ñ Ð² âdata-urlsâ.
Data url Ð¼Ð°Ñ ÑоÑÐ¼Ð°Ñ data:[<mediatype>][;base64],<data>. Ðи можемо викоÑиÑÑовÑваÑи ÑÐ°ÐºÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð±ÑдÑ-де, Ñк Ñ âзвиÑайнÑâ.
ÐапÑиклад, Ñмайлик:
<img src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA7">
ÐÑаÑÐ·ÐµÑ ÑозкодÑÑ ÑÑдок Ñа покаже зобÑаженнÑ:
ÐÐ»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Blob в base64 ми бÑдемо викоÑиÑÑовÑваÑи вбÑдований обâÑÐºÑ FileReader. ÐÑн може ÑиÑаÑи Ð´Ð°Ð½Ñ Ð· Blob в ÑÑзниÑ
ÑоÑмаÑаÑ
. РнаÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑÐ»Ñ next chapter ми глибÑе з ним познайомимоÑÑ.
ÐемонÑÑÑаÑÑÑ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Blob за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ base64:
let link = document.createElement('a');
link.download = 'hello.txt';
let blob = new Blob(['Hello, world!'], {type: 'text/plain'});
let reader = new FileReader();
reader.readAsDataURL(blob); // пеÑеÑвоÑиÑÑ Blob в base64 Ñа виклиÑе onload
reader.onload = function() {
link.href = reader.result; // data url
link.click();
};
Ðбидва ÑпоÑоби ÑÑвоÑÐµÐ½Ð½Ñ URL з Blob доÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑаннÑ. Ðле, пеÑеважно, URL.createObjectURL(blob) пÑоÑÑÑÑе Ñа ÑвидÑе.
- ÐÐµÐ¾Ð±Ñ Ñдно видалÑÑи поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑÐºÑ Ð´Ð»Ñ Ð·Ð²ÑлÑÐ½ÐµÐ½Ð½Ñ Ð¿Ð°Ð¼âÑÑÑ.
- ÐезпоÑеÑеднÑй доÑÑÑп до
Blobбез пÑомÑжного âзакодÑваннÑ/ÑозкодÑваннÑâ.
- ÐÐµÐ¼Ð°Ñ Ð¿Ð¾ÑÑеби звÑлÑнÑÑи поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° обâÑкÑи.
- ÐÑÑаÑи ÑвидкодÑÑ Ñа наванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° памâÑÑÑ Ñ ÑÐ°Ð·Ñ ÐºÐ¾Ð´ÑÐ²Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ
BlobобâÑкÑÑв.
ÐобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð² Blob
Також ми можемо ÑÑвоÑиÑи Blob Ñз зобÑаженнÑ, його ÑаÑÑини Ñи навÑÑÑ Ð·Ñ ÑкÑÑнÑоÑÑ ÑÑоÑÑнки. Це ÑÑане Ñ Ð½Ð°Ð³Ð¾Ð´Ñ, ÑкÑо кÑдиÑÑ Ð¿Ð¾ÑÑÑбно заванÑажиÑи ÑвÑÑлинÑ.
РобоÑа з зобÑаженнÑми вÑдбÑваÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑ <canvas>:
- canvas.drawImage викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ Ð·Ð¾Ð±ÑаженнÑ.
- Ðиклик canvas меÑÐ¾Ð´Ñ .toBlob(callback, format, quality) ÑÑвоÑÑÑ
BlobÑа виконÑÑcallback, пÑÑÐ»Ñ Ð·Ð°ÐºÑнÑеннÑ.
РнаÑÑÑÐ¿Ð½Ð¾Ð¼Ñ Ð¿ÑикладÑ, зобÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑлÑки копÑÑÑÑÑÑÑ, але, за поÑÑеби, ми можемо обÑÑзаÑи Ñи ÑÑанÑÑоÑмÑваÑи його пеÑед ÑÑвоÑеннÑм Blob:
// беÑемо бÑдÑ-Ñке зобÑаженнÑ
let img = document.querySelector('img');
// ÑÑвоÑÑÑмо <canvas> Ñакого ж ÑозмÑÑÑ
let canvas = document.createElement('canvas');
canvas.width = img.clientWidth;
canvas.height = img.clientHeight;
let context = canvas.getContext('2d');
// копÑÑÑмо в нÑого зобÑÐ°Ð¶ÐµÐ½Ð½Ñ (Ñей меÑод дозволÑÑ Ð²Ð¸ÑÑзаÑи ÑаÑÑÐ¸Ð½Ñ Ð·Ð¾Ð±ÑаженнÑ)
context.drawImage(img, 0, 0);
// напÑиклад, можна викликаÑи context.rotate() або багаÑо ÑнÑиÑ
опеÑаÑÑй
// toBlob -- Ñе аÑинÑ
Ñонна опеÑаÑÑÑ, пеÑÐµÐ´Ð°Ð½Ñ ÑÑнкÑÑÑ Ð±Ñде викликано пÑÑÐ»Ñ Ð³Ð¾ÑовноÑÑÑ
canvas.toBlob(function(blob) {
// Blob гоÑовий, заванÑажÑÑмо його
let link = document.createElement('a');
link.download = 'example.png';
link.href = URL.createObjectURL(blob);
link.click();
// видалÑÑмо внÑÑÑÑÑÐ½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Blob, Ñоб бÑаÑÐ·ÐµÑ Ð¼Ñг звÑлÑниÑи памâÑÑÑ
URL.revokeObjectURL(link.href);
}, 'image/png');
ЯкÑо ви надаÑÑе пеÑÐµÐ²Ð°Ð³Ñ async/await ÑинÑакÑиÑÑ Ð·Ð°Ð¼ÑÑÑÑ ÑÑнкÑÑй звоÑоÑнÑого викликÑ:
let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
ÐÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð·Ð½ÑмкÑв екÑÐ°Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑовÑваÑи бÑблÑоÑÐµÐºÑ https://github.com/niklasvh/html2canvas. Ðона пÑоÑÑо обÑ
одиÑÑ ÑÑоÑÑÐ½ÐºÑ Ñ Ð¼Ð°Ð»ÑÑ ÑÑ Ð² <canvas>. ÐоÑÑм ми можемо оÑÑимаÑи Blob Ñк показано виÑе.
Blob в ArrayBuffer
ÐонÑÑÑÑкÑÐ¾Ñ Blob дозволÑÑ ÑÑвоÑÑваÑи Blob майже з бÑдÑ-Ñого, Ñим паÑе з BufferSource.
Ðле ÑкÑо нам поÑÑÑбно виконаÑи низÑкоÑÑÐ²Ð½ÐµÐ²Ñ Ð¾Ð±ÑобкÑ, ми можемо оÑÑимаÑи найнижÑий ÑÑÐ²ÐµÐ½Ñ ArrayBuffer з blob.arrayBuffer():
// оÑÑимаÑи arrayBuffer з blob
const bufferPromise = await blob.arrayBuffer();
// or
blob.arrayBuffer().then(buffer => /* process the ArrayBuffer */);
ÐÑд Blob до поÑокÑ
Ðоли ми ÑиÑаÑмо Ñа пиÑемо в blob Ð´Ð°Ð½Ñ ÑозмÑÑом понад 2 ÐÐ, викоÑиÑÑÐ°Ð½Ð½Ñ arrayBuffer ÑÑÐ°Ñ Ð±ÑлÑÑ ÑнÑенÑивним Ð´Ð»Ñ Ð½Ð°Ñ. Ðа ÑÑÐ¾Ð¼Ñ ÐµÑÐ°Ð¿Ñ Ð¼Ð¸ можемо безпоÑеÑеднÑо пеÑеÑвоÑиÑи blob на поÑÑк.
ÐоÑÑк â Ñе ÑпеÑÑалÑний обâÑкÑ, Ñкий дозволÑÑ ÑиÑаÑи з нÑого (або запиÑÑваÑи в нÑого) ÑаÑÑина за ÑаÑÑиноÑ. Це Ð²Ð¸Ñ Ð¾Ð´Ð¸ÑÑ Ð·Ð° Ñамки ÑÑÑÑ ÑÑаÑÑÑ, але оÑÑ Ð¿Ñиклад, Ñ Ð²Ð¸ можеÑе пÑоÑиÑаÑи бÑлÑÑе на ÑÑоÑÑнÑÑ https://developer.mozilla.org/en-US/docs/Web/API/Streams_API. ÐоÑоки зÑÑÑÐ½Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð¸Ñ , ÑÐºÑ Ð¿ÑидаÑÐ½Ñ Ð´Ð»Ñ Ð¾Ð±Ñобки ÑаÑÑинами.
ÐеÑод stream() ÑнÑеÑÑейÑÑ Blob повеÑÑÐ°Ñ ReadableStream, Ñкий пÑд ÑÐ°Ñ ÑиÑÐ°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð´Ð°Ð½Ñ, Ñо мÑÑÑÑÑÑÑÑ Ð² Blob.
ÐÑоÑиÑаÑи з нÑого ми можемо, напÑиклад, оÑÑ Ñак:
// оÑÑимаÑи readableStream з blob
const readableStream = blob.stream();
const stream = readableStream.getReader();
while (true) {
// Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ ÑÑеÑаÑÑÑ: Ð´Ð°Ð½Ñ Ñ Ð½Ð°ÑÑÑпним ÑÑагменÑом(ÑаÑÑиноÑ) blob
let { done, value } = await stream.read();
if (done) {
// бÑлÑÑе Ð½ÐµÐ¼Ð°Ñ Ð´Ð°Ð½Ð¸Ñ
Ñ Ð¿Ð¾ÑоÑÑ
console.log('all blob processed.');
break;
}
// зÑобиÑи ÑоÑÑ Ñз ÑаÑÑÐ¸Ð½Ð¾Ñ Ð´Ð°Ð½Ð¸Ñ
, ÑÐºÑ Ð¼Ð¸ Ñойно пÑоÑиÑали з blob
console.log(value);
}
ÐÑдÑÑмки
ЯкÑо ArrayBuffer, Uint8Array Ñа ÑнÑÑ BufferSource пÑедÑÑавлÑÑÑÑ Ð¿ÑоÑÑо âбÑнаÑÐ½Ñ Ð´Ð°Ð½Ñâ, Ñо Blob Ñ âÑипÑзованими бÑнаÑними данимиâ.
Це ÑобиÑÑ Blob зÑÑÑним Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½ÑаженнÑ/заванÑаженнÑ, Ñо ÑаÑÑо поÑÑÑбно ÑобиÑи в бÑаÑзеÑÑ.
ÐеÑоди, Ñо виконÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñи, Ñк-Ð¾Ñ XMLHttpRequest, fetch Ñа ÑнÑÑ, можÑÑÑ Ð±ÐµÐ·Ð¿Ð¾ÑеÑеднÑо пÑаÑÑваÑи з Blob, Ñк Ñ Ð· ÑнÑими Ñипами бÑнаÑниÑ
даниÑ
.
Ðи можемо легко ÑÑанÑÑоÑмÑваÑи Ð´Ð°Ð½Ñ Ð¼Ñж Blob Ñа ÑнÑими низÑкоÑÑвневими бÑнаÑними Ñипами:
- Ðи можемо ÑÑвоÑиÑи
Blobз ÑипÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑивÑв з викоÑиÑÑаннÑм конÑÑÑÑкÑоÑÑnew Blob(...). - Ðи можемо повеÑнÑÑи
ArrayBufferз Blob за допомогоÑblob.arrayBuffer(), а поÑÑм ÑÑвоÑиÑи над ним Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð¸Ð·ÑкоÑÑÐ²Ð½ÐµÐ²Ð¾Ñ Ð´Ð²ÑÐ¹ÐºÐ¾Ð²Ð¾Ñ Ð¾Ð±Ñобки.
ÐоÑоки пеÑеÑвоÑÐµÐ½Ð½Ñ Ð´Ñже коÑиÑнÑ, коли нам поÑÑÑбно обÑоблÑÑи великий blob. Ðи можеÑе легко ÑÑвоÑиÑи ReadableStream з blob. ÐеÑод stream() ÑнÑеÑÑейÑÑ Blob повеÑÑÐ°Ñ ReadableStream, Ñкий пÑÑÐ»Ñ ÑиÑÐ°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð´Ð°Ð½Ñ, Ñо мÑÑÑÑÑÑÑÑ Ñ ÑÑÐ¾Ð¼Ñ blob.

ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)