Предыстория:
Я хочу создать «приложение», которое использует только JavaScript/HTML и может быть открыто браузером непосредственно из файловой системы. Это приложение должно иметь возможность считывать данные из другого файла. Затем я буду использовать JS для его анализа и отображения страниц. В качестве упрощенного примера представьте, что у меня есть CSV-файл (скачать здесь):
Mark Rodgers,[email protected],Accounting
[...]
Melissa Jones,[email protected],CEO
Я хочу иметь возможность читать файл с помощью JS и использовать данные в нем для создания моей страницы.
Что я уже сделал:
Демо (щелкните правой кнопкой мыши -> "Сохранить как", чтобы сохранить 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 получить содержимое); тоже норм.
--allow-file-access-from-files
, чтобы разрешить доступ к схемеfile://
. Я не уверен, что Chrome позволит сделать это каким-либо другим, более удобным способом, из соображений безопасности. - person Stan   schedule 26.11.2012file:///
. - person NullUserException   schedule 30.11.2012