Шрифт:
out.appendChild(document.createTextNode(text));// Вывести содержимое
} // файла
reader.onerror = function(e) { // Если что-то пошло не так
console.log("Error", .e); // Вывести сообщение об ошибке
};
}
</script>
// Выберите файл для отображения:
<input type="file" onchange=”readfile(this. files[0])"x/input>
<pre id="output"x/pre>
Метод
readAsArrayBuffer
похож на метод readAsText,
за исключением того, что требует приложить чуть больше усилий при работе с результатом, возвращая объект ArrayBuffег
вместо строки. Пример 22.12 демонстрирует использование метода readAsArrayBuffer
для чтения первых четырех байтов из файла в виде целого числа с прямым порядком следования байтов. Пример 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. Это мощная и важная форма локального хранилища, поэтому она будет описана здесь, несмотря на то что ее прикладной интерфейс еще менее стабилен, чем другие прикладные интерфейсы, описываемые в этой главе. Данный раздел охватывает лишь основные задачи, выполняемые с файловой системой, и не демонстрирует всех возможностей прикладного интерфейса. Так как обсуждаемый здесь прикладной интерфейс является новым и нестабильным, он не описывается в справочном разделе этой книги. Работа с файлами в локальной файловой системе является многоэтапным процессом. Прежде всего, необходимо получить объект, представляющий саму файловую систему. Сделать это можно с помощью синхронного прикладного интерфейса в фоновом потоке или асинхронного - в основном потоке выполнения:
// Метод синхронного получения файловой системы. Принимает параметры,
// определяющие срок существования файловой системы и ее размер.