HTML5 [1] |
CSS3 [1] |
JavaScript [3] |
JS in HTML5 [4] |
Canvas (Context2D) [1] |
Canvas (WebGL) [0] |
Browser Technologies [2] |
jQuery [1] |
ExtJS [0] |
Prototype.js [2] |
SVG [2] |
Browsers [2] |
Mozilla Plugins
[0]
XUL, Jetpack, etc.
|
Web [2] |
MeowW [4] |
iOS [0] |
Алгоритмы [0] |
Криптография [0] |
Теория игр [0] |
Теория вероятностей [0] |
Математика [1] |
Мат. анализ [0] |
Алгебра [0] |
Дискретная математика [0] |
Теория графов [0] |
Комбинаторика [0] |
Теория чисел [0] |
Комплексный анализ [0] |
Матлогика
[0]
Математическая логика, её связь с теорией алгоритмов и т.п.
|
Тензоры [0] |
Геометрия [0] |
Топология [0] |
Дифференциальная геометрия [0] |
Дифференциальные уравнения [0] |
20:00:55 FileAPI & FileSystemAPI - изучаем... |
ВведениеВ данной статье мы рассмотрим FileAPI и FileSystemAPI, а также немного Drag&Drop. На всякий случай поясню: это несколько технологий HTML5, позволяющие работать с файлами. Drag&Drop - юзер могет перетащить к нам на страницу файлы, а мы их получим, прочтём, узнаем метаданные... Drag and Drop - это именно получение файла, перетащенного на страницу; а работа с ним и чтение - уже FileAPI. FileSystemAPI - это ещё одно хранилище данных, по типу LocalStorage, GlobalStorage, SessionStorage, WebSQL и IndexedDB. Но здесь мы можем оперировать файлами, папками, сохранять туда картинки и прочие бинарники. А ещё можно сделать его неограниченного размера. FileAPI и FileSystemAPI предоставляют нам несколько классов (объектов):
Куда нам столько?! Ну ладно, смотрим. FileinputТеперь можно легко получить файл (файлы), выбранные в файл-инпуте. Просто обращаемся к его свойству files и получаем объект класса FileList. Code <input type="file" id="fileinput" /> < script> alert(document.getElementById('fileinput').files); // [object FileList] </script> Drag and DropФайлы на страницуТакже юзер может перетащить файл на страницу. Мы должны быть готовы правильно принять файл. Итак, при перетаскивании генерируются следующие события:
Вообще говоря, Drag&Drop (не знаю, работал ли он с файлами) был реализован ещё в IE5, а затем перекочевал в Safari. Ну а затем появился в HTML5. Итак, поехали дальше. Code var b=document.body; b.addEventListener('dragenter', function(e){ e.stopPropagation(); e.preventDefault(); b.style.backgroundColor='#aaa'; return false; }, false); b.addEventListener('dragover', function(e){ e.stopPropagation(); e.preventDefault(); return false; }, false); b.addEventListener('dragleave', function(e){ e.stopPropagation(); e.preventDefault(); b.style.backgroundColor='#fff'; return false; }, false); b.addEventListener('drop', function(e){ e.stopPropagation(); e.preventDefault(); b.style.backgroundColor='#f00'; // e.dataTransfer.files - объект [FileList] return false; }, false); Итак, нам необходимо отменить стандартную реакцию (и запретить всплывать) на события dragenter, dragover, dragleave и drop: event.stopPropagation(); event.preventDefault(); (заодно сделаем и return false). Затем мы получаем перетащенные файлы из event.dataTransfer.files. Файлы со страницыБолее того: мы можем перетащить файлы со страницы в программу. Например, в Photoshop. Для этого ловим какое-нибудь событие, например dragstart, а затем используем метод event.dataTransfer.setData(type, data). В качестве type указываем MIME-тип (например, text/plain для обычного текста), а в качестве data - данные, т.е. содержимое файла. Code document.body.addEventListener('dragstart', function(e){ e.dataTransfer.setData('text/plain', 'Это перетащенный текст. Да. Вот так.'); }, false); Примечание: если перетащить текст в файловый менеджер, должен появиться новый файл с перетаскиваемым текстом. Так, по крайней мере, ведёт себя Nautilus, файл-менеджер для Linux. BlobА теперь - класс Blob. Он небольшой и очень простой. Есть два свойства:
Кроме того, есть функция slice(start, end, [contentType]) - она возвращает байты с start по end. Необязательный параметр contentType указывает, в каком типе должны быть данные. FileИтак, класс File - это, собственно, файл. Как я уже говорил, он наследуется от класса Blob. Вот, какие у него есть свойства (и методы):
FileListИтак, FileList - это класс, содержащий несколько файлов. Именно он берётся из fileinput.files и event.dataTransfer.files. Работать можно как с обычным массивом: Code alert(e.dataTransfer.files); // [object FileList] alert(e.dataTransfer.files[0]); // [object File] alert(e.dataTransfer.files[0].name); // выведет имя первого файла Кроме того, есть свойство length, указывающее на количество файлов и метод item(index), возвращающий файл с заданным индексом (FileList[0] == FileList.item(0)). FileReaderМы можем прочитать файл с помощью класса FileReader, который действует похожим образом с XMLHTTPRequest. Кстати говоря, класс Blob мы тоже можем читать тем же образом. Правда работает класс FileReader малость странно. Но всё равно. Code var file=event.dataTransfer.files[0]; var freader=new FileReader(); freader.onloadend=function(e){ // this.result } freader.readAsText(file); А теперь разбираем - как, да что. Вначале создаём пустой объект класса FileReader. Затем назначаем ему обработчик события loadend - когда файл прочитается. Ну а затем запускаем чтение файла file методом getAsText(file). Есть следующие методы для чтения файла:
Поехали дальше. Есть обработчики событий:
Функциям-обработчикам передаётся объект event. Он содержит след. параметры:
У FileReader есть также свойство readyState. Оно содержит одну из следующих констант:
Ну и наконец FileReader содержит свойство result - при удачном чтении файла, содержащее его содержимое; и свойство error - при ошибке содержащее объект класса FileError. FileReaderSyncА с помощью класса FileReaderSync, мы можем читать файлы синхронно. Если кто не знаком с ajax, на всякий случай поясню. Синхронный - это когда мы применяем метод, и пока он не исполнится, код дальше исполняться не будет. Пример: alert. Мы можем применить метод alert, а за ним понаписать остальной код. И этот остальной код исполнится лишь ПОСЛЕ alert-а, а не одновременно с ним. Вот это синхронно. Асинхронно - это когда мы понапишем остальной код, а он весь исполнится ОДНОВРЕМЕННО с alert-ом. Как вы могли заметить, класс FileReader работает асинхронно. Мы ставим обработчик на событие load, запускаем метод чтения и идём дальше, не задерживаясь. Когда файл будет прочитан, обработчик события будет исполнен. Класс FileReaderSync работает синхронно. В нём нету никаких обработчиков. Нету даже метода abort(), и это логично: он применяется во время чтения, а во время чтения FileReaderSync никакой другой код не исполняется. Есть лишь четыре метода: readAsText, readAsBinaryString, readAsDataURL и readAsArrayBuffer. Мы запускаем чтение, а за ним сразу ставим обработку результата. При окончании чтения она выполнится. Code var file=event.dataTransfer.files[0]; var freader=new FileReaderSync(); freader.readAsText(file); if(freader.error){ // обработка ошибки } else if(freader.result){ // freader.result - значение } Продолжение следует...Статья выдалась большая и красивая. Уверен, вы устали. Я - точно устал :). Ждите продолжение, скоро будет. Там раскроем запись в файлы, создание Blob-ов. А ещё сохранение файлов. И не забывайте почаще заходить на uCozerer! |
|
Всего комментариев: 0 | |