Чтение онлайн

ЖАНРЫ

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

Пример 22.12. Чтение первых четырех байтов из файла

<script>

// Исследует первые 4 байта в указанном двоичном объекте. Если это "сигнатура",

// определяющая тип файла, асинхронно устанавливает свойство двоичного объекта.

function typefile(file) {

var slice = file.slice(0,4); // Читать только первые 4 байта

var reader = new FileReader; // Создать асинхронный FileReader

reader.readAsArrayBuffer(slice); // Прочитать фрагмент файла

reader.onload = function(e) {

var buffer = reader.result; //
Результат - ArrayBuffer

var view = new DataView(buffer); // Получить доступ к результату

var magic = view.getUint32(0, false); // 4 байта, прямой порядок

switch(magic) { // Определить по ним тип файла

case 0х89504Е47: file.verified_type = "image/png"; break;

case 0x47494638: file.verified_type = "image/gif"; break;

case 0x25504446: file.verified_type = "application/pdf"; break;

case 0x504b0304: file.verified_type = "application/zip"; break;

}

console.log(file.name, file.verified_type);

};

}

</script>

<input type="file" onchange="typefile(this. files[0])”></input>

В фоновых потоках выполнения вместо объекта

FileReader
можно использовать объект
FileReaderSync
. Синхронный прикладной интерфейс определяет те же методы
readAsText
и
readAsArrayBuffer,
которые принимают те же аргументы, что и их асинхронные версии. Разница заключается лишь в том, что синхронные методы блокируются до окончания операции и непосредственно возвращают результат в вид строки или объекта
ArrayBuffer
, что избавляет от необходимости использовать обработчики событий. Пример 22.14 ниже демонстрирует использование объекта
FileReaderSync
.

22.7. Прикладной интерфейс к файловой системе

В разделе 22.6.5 вы познакомились с классом

FileReader
, использовавшимся для чтения содержимого файлов, выбираемых пользователем, или любых двоичных объектов. Типы
File
и
Blob
определяются проектом спецификации, известной как «File АРІ». Проект другой спецификации, еще более новой, чем «File АРІ», дает веб-приложениям управляемый доступ к частной файловой системе, где они могут писать в файлы, читать файлы, создавать каталоги, читать содержимое каталогов и т. д. На момент написания этих строк данный прикладной интерфейс к файловой системе был реализован только в броузере Google Chrome. Это мощная и важная форма локального хранилища, поэтому она будет описана здесь, несмотря на то что ее прикладной интерфейс еще менее стабилен, чем другие прикладные интерфейсы, описываемые в этой главе. Данный раздел охватывает лишь основные задачи, выполняемые с файловой системой, и не демонстрирует всех возможностей прикладного интерфейса. Так как обсуждаемый здесь прикладной интерфейс является новым и нестабильным, он не описывается в справочном разделе этой книги.

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

// Метод синхронного получения файловой системы. Принимает параметры,

// определяющие срок существования файловой системы и ее размер.

// Возвращает объект файловой системы или возбуждает
исключение,

var fs = requestFileSystemSync(PERSISTENT, 1024*1024);

// Асинхронная версия принимает функции обратного вызова для обработки

// успешного или неудачного создания файловой системы

requestFileSystem(TEMPORARY, // срок существования

50*1024*1024, // размер: 50 Мбайт

function(fs) { // будет вызвана с объектом файловой системы

// Здесь используется объект fs

},

function(e) { // будет вызвана с объектом ошибки

console.log(е); // Или как-то иначе обработать ошибку

});

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

PERSISTENT
(постоянная), подходит для веб-приложений, которым требуется хранить пользовательские данные постоянно. Броузер не будет удалять эту файловую систему, пока пользователь явно не потребует этого. Файловая система, срок существования которой определяется константой
TEMPORARY
(временная), подходит для веб-приложений, которые требуют кэшировать данные, но также сохраняют работоспособность и после того, как веб-броузер удалит файловую систему. Размер файловой системы определяется в байтах и должен быть равен разумному верхнему пределу объема данных, которые потребуется сохранять. Броузер может ограничивать этот размер, устанавливая квоты.

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

Обратите внимание, что в именах этих функций присутствует слово «request» (запросить). Когда приложение вызывает одну из этих функций в первый раз, броузер может запросить разрешение у пользователя, прежде чем создать файловую систему и разрешить доступ к ней. [59]

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

Объект файловой системы, полученный одним из методов, представленных выше, имеет свойство

root
, ссылающееся на корневой каталог файловой системы. Это объект
DirectoryEntry
, и он может иметь вложенные каталоги, представленные собственными объектами
DirectoryEntry
. Каждый каталог в файловой системе может содержать файлы, представленные объектами
FileEntry
. Объект
DirectoryEntry
определяет методы для получения объектов
DirectoryEntry
и
FileEntry
по пути в файловой системе (они могут создавать новые каталоги и файлы, если указанное имя не существует). Объект
DirectoryEntry
также определяет фабричный метод
createReader,
возвращающий объект
DirectoryReader
, который позволяет получить список содержимого каталога.

59

На момент написания этих строк броузер Chrome не запрашивал разрешение у пользователя, но требовал, чтобы он был запущен с ключом командной строки — unlimited-quota-for-files.

Поделиться с друзьями: