Share via


Создание файлов с помощью средства BlobBuilder

По мере того, как веб-сайты все больше превращаются в веб-приложения, увеличивается необходимость обеспечить удобную работу с файлами. Начиная со второй версии Platform Preview Internet Explorer 10 поддерживает интерфейс File API, позволяющий разработчикам читать файлы и разбивать их на клиенте. В Platform Preview 4 добавлена поддержка средства BlobBuilder, позволяющая разработчикам создавать новые файлы. В Internet Explorer 10 также есть два новых метода для сохранения больших двоичных объектов на компьютере, что очень удобно при работе с данными, хранящимися на клиентах.

На сайте тестирования Internet Explorer 10 Test Drive мы создали веселую демонстрацию пианино, показывающую возможности BlobBuilder и File API. При нажатии клавиши пианино сайт создает два файла: музыкальный MP3-файл и SVG-файл с нотами. Можно увидеть, как размер обоих файлов меняется при каждом нажатии клавиши. Нажмите кнопку воспроизведения, чтобы прослушать песню, или загрузите музыкальный или SVG-файл, щелкнув ссылки над клавишами пианино. Далее в этой записи блога я опишу, как работает эта демонстрация, уделив основное внимание возможностям BlobBuilder и File API.

Снимок экрана демонстрации с пианино, в которой используется BlobBuilder.

Возможности объекта BlobBuilder

BlobBuilder (буквально — построитель BLOB-объектов), как следует из названия, — это способ построения больших двоичных объектов на клиенте. Основной метод для этого — append. Функция append принимает три типа данных:

  • большие двоичные объекты;
  • обычный текст;
  • буферы массивов.

Демонстрация с пианино создает MP3-файл, добавляя большие двоичные объекты друг к другу, используя один объект для каждой ноты. Демонстрация создает SVG-файл с нотами, добавляя текст с источником SVG.

getBlob — это еще один метод, доступный в объекте BlobBuilder, который возвращает большой двоичный объект со всеми ранее добавленными элементами. Вот простой пример, в котором BlobBuilder используется для создания текстового файла:

// The BlobBuilder constructor is prefixed in all browsers.

// Use MSBlobBuilder in IE, MozBlobBuilder in Firefox, and WebKitBlobBuilder in WebKit-based browsers.

var bb = new MSBlobBuilder();

 

bb.append("Hello World!");

var blob1 = bb.getBlob("text/plain");

О методе getBlob следует сказать следующее: при вызове getBlob в Internet Explorer 10 и Firefox очищается содержимое объекта BlobBuilder, поэтому следующий вызов метода append аналогичен добавлению данных в новый объект BlobBuilder. На данный момент WebKit не очищает содержимое BlobBuilder после вызова getBlob. Рассмотрим следующий пример:

var bb = new MSBlobBuilder();

bb.append("Hello World!");

var blob1 = bb.getBlob("text/plain");

bb.append("BlobBuilder is great");

var blob2 = bb.getBlob("text/plain");

Во всех браузерах blob1 будет содержать текст «Hello World!». Но для blob2 все будет по-другому. В Internet Explorer 10 и Firefox blob2 будет содержать текст «BlobBuilder is great», а в браузерах на основе WebKit он будет содержать текст «Hello World!BlobBuilder is great». Эта несогласованность все еще обсуждается в рабочей группе Web Applications.

Получение больших двоичных объектов с помощью XHR

Интерфейс File API упрощает доступ к файлам, выбранным пользователем, как было показано в демонстрации Magnetic Poetry. Это прекрасно, если вы хотите встроить данные пользователей в собственный сайт. Но в демонстрации с пианино мне нужно было встроить файлы нот. Если необходимо работать с большими двоичными объектами и при этом предоставлять данные, можно использовать XHR.

В Internet Explorer 10 представлено новое свойство XHR — responseType. Свойство responseType поддерживает четыре значения: blob, array buffer, text и document. В методе инициализации, который используется в демонстрации с пианино, — getBlobs() — вы увидите следующее:

var req = new XMLHttpRequest();

var url = 'PianoNotes/AllNotes2.mp3';

req.open('GET', url, false);

req.responseType = "blob";

req.onload = function () { /* ... */ };

req.send(null);

Следует отметить, что в демонстрации выполняется один запрос XHR. Загружается только один файл, содержащий все ноты, используемые в демонстрации. Но если нажать клавишу в демонстрации, проигрывается только одна нота, а сайт добавляет в MP3-файл только одну ноту. Чтобы реализовать это, после загрузки файла со всеми нотами сайт разбивает файл с помощью метода slice интерфейса File API и извлекает 24 отдельные ноты. Это значительно повышает производительность по сравнению с загрузкой 24 отдельных файлов.

Создание музыкального файла

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

musicBlobBuilder.append(noteBlob);

Чтобы обновить размер файла, я получаю большой двоичный объект и затем получаю размер файла.

var musicBlob = musicBlobBuilder.getBlob("audio/mp3");

// display musicBlob.size

Так как я знаю, что объект BlobBuilder был очищен после вызова getBlob, я просто добавлю большой двоичный объект назад в:

musicBlobBuilder.append(musicBlob);

Создание SVG-файла

При каждом нажатии клавиши в демонстрации нота добавляется в нотную запись. Ноты рисуются одним SVG-элементом в div с идентификатором «scoreContainer». При каждом нажатии клавиши выполняется скрипт, который добавляет ноту в SVG-элемент, после чего создается SVG-файл за счет дополнения источника:

svgBlobBuilder.append(document.getElementById("scoreContainer").innerHTML);

var svgBlob = svgBlobBuilder.getBlob("image/svg+xml");

// display svgBlob.size

В этом случае я не заполняю svgBlobBuilder повторно, потому что хочу начать с чистого листа, когда пользователь в следующий раз нажмет клавишу.

Сохранение файлов на диск

Последняя часть демонстрации — сохранение файлов на диск. Если перейти по ссылкам «Music File» (Музыкальный файл) и «Musical Score File» (Файл нотной записи) над клавишами пианино, вы сможете сохранить файл точно так же, как вы загружаете файл:

Строка уведомления, отображаемая в Internet Explorer 10 в ответ на вызов msOpenOrSaveBlog().

Учтите, что строка уведомления недоступна в версиях Platform Preview. Вместо нее используется диалоговое окно сохранения файла.

Каждая ссылка вызывает метод saveSong() или saveSheetMusic(). Если рассмотреть каждый из них, то можно увидеть, что они используют функцию msSaveOrOpenBlob:

window.navigator.msSaveOrOpenBlob(svgBlob, "MusicScore.svg");

msSaveOrOpenBlob и msSaveBlob — это два метода, доступные в Internet Explorer 10 и позволяющие запросить у пользователя сохранение большого двоичного объекта на компьютер.

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

Создание демонстрации пианино было веселым опытом, и я с нетерпением жду, как вы будете использовать BlobBuilder. Ждем ваших откликов!

— Шэрон Ньюмэн (Sharon Newman), руководитель программы, Internet Explorer