Фон:
Я хочу создать "приложение", которое использует только JavaScript/HTML и может быть открыто браузером непосредственно из файловой системы. Это приложение должно иметь возможность читать данные из другого файла. Затем я буду использовать JS для анализа и отображения страниц. В качестве упрощенного примера предположим, что у меня есть файл CSV (скачать здесь):
Mark Rodgers,[email protected],Accounting
[...]
Melissa Jones,[email protected],CEO
Я хочу, чтобы иметь возможность читать файл с помощью JS и использовать в нем данные для создания моей страницы.
Что я сделал до сих пор:
Demo (щелкните правой кнопкой мыши → "Сохранить как", чтобы сохранить HTML на свой компьютер). Он также доступен на jsfiddle в полуразрушенном режиме (макет разбит, но он все равно должен быть функционально корректным).
Просто перетащите текстовый файл CSV в поле перетаскивания или выберите текстовый файл, используя меню файла, и JavaScript прочитает, проанализирует файл и заполнит таблицу.
Это зависит от API FileReader; большая часть тяжелого подъема выполняется с помощью этой функции:
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.target.files || evt.dataTransfer.files; // FileList object.
var file = files[0];
// this creates the FileReader and reads stuff as text
var fr = new FileReader();
fr.onload = parse;
fr.readAsText(file);
// this is the function that actually parses the file
// and populates the table
function parse()
{
var table = document.getElementById('emps');
var employees = fr.result.split('\n'); var c = 0;
for (var i in employees)
{
var employee = employees[i].split(',');
if (employee.length == 3)
{
var row = document.createElement('tr');
row.innerHTML = "<td>" + employee.join("</td><td>") + "</td>";
table.appendChild(row);
c++;
}
}
document.getElementById('result').innerHTML = '<span>Added ' + c + ' employees from file: ' + file.name + '</span>';
}
}
Это почти нормально, но это неудобно для пользователя вручную загружать файл. В идеале он должен иметь возможность загружать его автоматически, но по соображениям безопасности браузер не позволит этого... пока.
Требования к решению:
-
Должна работать в автономном режиме; т.е.: он не может полагаться на какое-либо онлайн-обслуживание. Это также включает HTTP-серверы, запущенные на локальной машине. Идея состоит в том, чтобы этот запуск выполнялся на любом компьютере с установленным браузером.
-
Должна работать, когда страница открывается с использованием протокола
file:///
(т.е. HTML-страницы на жестком диске). -
Если не полагаться на сторонние дополнения (например: Flash, Java, дрожит ActiveX). Я уверен, что они, вероятно, не сработают, если страница находится в
file:///
-
Он должен иметь возможность принимать произвольные данные. Это исключает загрузку файла в хорошо организованном формате, который готов к использованию как JSON.
-
Если он работает на обоих (идеально оба) Firefox или Chrome, это прекрасно. Это также ОК, чтобы полагаться на экспериментальные API
Я знаю, что имя файла заблаговременно, поэтому оно может быть закодировано в самом HTML. Любое решение, которое позволяет мне читать файл с диска, отлично, ему не нужно использовать API FileReader.
Итак, если есть умный взлом для загрузки файла на страницу, которая тоже очень хороша (возможно, загрузите его в невидимый iframe и получите JS-содержимое); это тоже ОК.