JavaScript. Подробное руководство, 6-е издание, стр. 390

22.6.2. Загрузка двоичных объектов

Глава 18 охватывает тему выполнения HTTP-запросов с помощью объекта

<b>XMLHttpRequest</b>
и также описывает некоторые новые возможности, определяемые проектом спецификации «XMLHttpRequest Level 2» (XHR2). На момент написания этих строк спецификация XHR2 определяла способ загрузки содержимого URL-адреса в виде двоичного объекта, но реализации броузеров пока не поддерживали его. Поскольку программный код не может быть протестирован, этот раздел является лишь схематическим описанием прикладного интерфейса, предусматриваемого спецификацией XHR2 для работы с двоичными объектами.

Пример 22.9 демонстрирует простой способ загрузки двоичного объекта из Веб. Сравните его с примером 18.2, который загружает содержимое URL-адреса как простой текст.

Пример 22.9, Загрузка двоичного объекта с помощью объекта

<b>XMLHttpRequest</b>

<b>// Запрашивает методом GET содержимое URL в виде двоичного объекта и передает его</b>

<b>// указанной функции обратного вызова. Этот программный код не тестировался: на тот</b>

<b>// момент, когда он был написан, броузеры еще не поддерживали этот прикладной интерфейс, </b>

<b>function getBlob(url, callback) {</b>

<b>  var xhr = new XMLHttpRequest(); // Создать новый объект XHR</b>

<b>  xhr.open(&quot;GET&quot;, url);     // Указать URL-адрес</b>

<b>  xhr.responseType = &quot;blob&quot; // Желательно получить двоичный объект</b>

<b>  xhr.onload = function() { // onload проще, чем onreadystatechange</b>

<b>    callback(xhr.response): // Передать ответ функции обратного вызова</b>

<b>  }                         // Отметьте: .response, а не .responseText</b>

<b>  xhr.send(null);           // Послать запрос</b>

<b>}</b>

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

<b>onprogress</b>
в комплексе с приемами чтения двоичных объектов, которые демонстрируются в разделе 22.6.5.

22.6.3. Конструирование двоичных объектов

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

<b>Blob</b>
из имеющихся данных можно с помощью объекта
<b>BlobBuilder</b>
:

<b>// Создать новый объект BlobBuilder</b>

<b>var bb = new BlobBuilder();</b>

<b>// Добавить в двоичный объект строку и отметить ее конец символом NUL</b>

<b>bb.append(&quot;Данный двоичный объект содержит этот текст и 10 ” +</b>

<b>  &quot;32-битных целых чисел с прямым порядком следования байтов.&quot;);</b>

<b>bb.append(&quot;\0&quot;); // Добавить символ NUL, чтобы отметить конец строки</b>

<b>// Сохранить некоторые данные в объекте ArrayBuffer</b>

<b>var ab = new ArrayBuffer(4*10);</b>

<b>var dv = new DataView(ab);</b>

<b>for(var і = 0: і &lt; 10; i++) dv.setlnt32(i*4,i);</b>

<b>// Добавить ArrayBuffer в двоичный объект</b>

<b>bb.append(ab);</b>

<b>// Теперь извлечь полученный двоичный объект, указав искусственный М1МЕ-тип</b>

<b>var blob = bb.getBlob(&quot;x-optional/mime-type-here&quot;);</b>

В начале этого раздела мы узнали, что двоичные объекты имеют метод

<b>slice(),</b>
который разбивает их на фрагменты. Точно так же имеется возможность объединять двоичные объекты, передавая их методу
<b>append()</b>
объекта
<b>BlobBuilder</b>
.

22.6.4. URL-адреса, ссылающиеся на двоичные объекты

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

<b>XMLHttpRequest</b>
.

Создаются URL-адреса, ссылающиеся на двоичные объекты, с помощью функции

<b>createObjectURL().</b>
На момент написания этих строк проект спецификации и Firefox 4 помещали эту функцию в глобальный объект URL, а броузер Chrome и библиотека Webkit добавляли свой префикс к имени этого объекта, называя его webkitURL. Ранние версии спецификации (и ранние реализации броузеров) помещали эту функцию непосредственно в объект
<b>Window</b>
. Чтобы получить возможность переносимым образом создавать URL-адреса, ссылающиеся на двоичные объекты, можно определить вспомогательную функцию, как показано ниже:

<b>var getBlobURL = (window.URL &amp;&amp; URL.createObjectURL.bind(URL)) ||</b>

<b>    (window.webkitURL &amp;&amp; webkitURL.createObjectURL.bind(webkitURL)) ||</b>

<b>     window.createObjectURL;</b>

Фоновые потоки выполнения также могут использовать этот прикладной интерфейс и обращаться к тем же функциям, в том же объекте URL (или webkitURL).

Если передать двоичный объект функции

<b>createObjectURL(),</b>
она вернет URL-адрес (в виде обычной строки). Этот адрес начинается с названия схемы blob://, за которой следует короткая строка, ссылающаяся на двоичный объект с некоторым уникальным идентификатором. Обратите внимание, что эти URL-адреса совершенно не похожи на URL-адреса data://, которые представляют свое собственное содержимое. URL-адрес, ссылающийся на двоичный объект, - это просто ссылка на объект
<b>Blob</b>
, хранящийся в памяти броузера или на диске. URL-адреса вида blob:// также отличаются от URL-адресов file://, которые ссылаются непосредственно на файл в локальной файловой системе, давая возможность увидеть путь к файлу, позволяя просматривать содержимое каталогов и тем самым затрагивая проблемы безопасности.