22.6. Двоичные объекты

Двоичный объект (Blob) - это нетипизированная ссылка, или дескриптор, блока данных. Название «Blob» пришло из мира баз данных SQL, где оно расшифровывается как «Binary Large Object» (большой двоичный объект). В языке JavaScript двоичные объекты часто представляют двоичные данные, и они могут иметь большой размер, но это совсем необязательно: двоичный объект Blob может также представлять содержимое небольшого текстового файла. Двоичные объекты непрозрачны, т. е. являются своего рода черными ящиками: все, что можно с ними сделать, - это определить их размер в байтах, узнать MIME-тип и разбить на более мелкие двоичные объекты:

var blob = ... // Как получить двоичный объект, будет показано ниже

blob.size      // Размер двоичного объекта в байтах

blob.type      // МІМЕ-тип двоичного объекта или если неизвестен

var subblob = blob.slice(0,1024, "text/plain"); // Первый килобайт - как текст

var last = blob.slice(blob.size-1024, 1024);    // Последний килобайт -

                                                // как нетипизированные данные

Веб-броузеры могут сохранять двоичные объекты в памяти или на диске, и двоичные объекты могут представлять действительно огромные блоки данных (такие как видеофайлы), которые слишком велики, чтобы их можно было уместить в памяти, предварительно не разбив на более мелкие части с помощью метода slice(). Поскольку двоичные объекты могут иметь огромный размер и для работы с ними может потребоваться доступ к диску, прикладные интерфейсы для работы с ними действуют асинхронно (имеются также синхронные версии для использования в фоновых потоках выполнения).

Сами по себе двоичные объекты не представляют особого интереса, но они служат важным механизмом обмена данными для некоторых прикладных интерфейсов в языке JavaScript, которые работают с двоичными данными. На рис. 22.2 показано, как можно обмениваться двоичными объектами во Всемирной паутине, читать и сохранять их в локальной файловой системе, в локальных базах данных и даже обмениваться ими с другими окнами и фоновыми потоками выполнения. Он также показывает, как можно получить содержимое двоичного объекта в виде текста, типизированного массива или URL-адреса.

Прежде чем приступать к работе с двоичным объектом, его необходимо получить. Сделать это можно множеством способов, одни из которых связаны с использованием уже знакомых вам прикладных интерфейсов, а другие - с прикладными интерфейсами, которые описываются ниже в этой главе:

• Двоичные объекты поддерживаются алгоритмом структурированного копирования (смотрите врезку «Структурированные копии» выше), а это означает, что их можно получить от другого окна или фонового потока выполнения вместе с событием «message» (разделы 22.3 и 22.4).

•  Двоичные объекты можно извлекать из баз данных на стороне клиента, как описывается в разделе 22.8.

• Двоичные объекты можно загрузить из сети по протоколу HTTP, используя ультрасовременные возможности, определяемые спецификацией XHR2. Об этом рассказывается в разделе 22.6.2.

• Можно также создать свой двоичный объект, сконструировав его с помощью объекта BlobBuilder из строки, объекта ArrayBuffег (раздел 22.5) или другого двоичного объекта. Объект BlobBuilder будет демонстрироваться в разделе 22.6.3.

• Наконец, и, пожалуй, самое важное, - объект File в клиентском JavaScript является подтипом типа Blob: объект File - это просто двоичный объект с данными, которые имеют имя и дату последнего изменения. Получить объект File можно из элемента <input type="file"> и от прикладного интерфейса буксировки мышью (drag-and-drop), как описывается в разделе 22.6.1. Объект File можно также получить с помощью прикладного интерфейса доступа к файловой системе, который охватывается в разделе 22.7.

Получив двоичный объект, над ним можно выполнить различные операции, многие из которых являются симметричными операциям, описанным выше:

• Двоичный объект можно отправить другому окну или фоновому потоку выполнения с помощью метода postMessage() (разделы 22.3 и 22.4).

•  Двоичный объект можно сохранить в базе данных на стороне клиента (раздел 22.8).

• Двоичный объект можно выгрузить на сервер, передав его методу send() объекта XMLHttpRequest. Как это можно реализовать, демонстрирует пример 18.9 выгрузки файла (напомню, что объект File - это всего лишь специализированная разновидность двоичного объекта Blob).

• Можно воспользоваться функцией createObjectURL(), чтобы получить специальный URL-адрес вида blob://, ссылающийся на двоичное содержимое, и затем использовать его вместе с механизмами DOM или CSS. Этот прием демонстрируется в разделе 22.6.4.

• Можно воспользоваться объектом FileReader, чтобы асинхронно (или синхронно, в фоновом потоке выполнения) извлечь содержимое двоичного объекта в строку или в объект ArrayBuffег. Этот прием демонстрируется в разделе 22.6.5.

• Можно воспользоваться прикладным интерфейсом доступа к файловой системе и объектом FileWriter, который описывается в разделе 22.7, чтобы записать двоичный объект в локальный файл.

В следующих подразделах демонстрируются простые способы получения и использования двоичных объектов. Более сложные приемы, связанные с использованием локальной файловой системы и базами данных на стороне клиента, будут описаны далее, в отдельных разделах.