【发布时间】:2012-11-05 21:12:01
【问题描述】:
背景:
我想制作一个仅使用 JavaScript/HTML 的“应用程序”,并且可以由浏览器直接从文件系统打开。此应用必须能够从另一个文件中读取数据。然后,我将使用 JS 对其进行解析并呈现页面。作为一个简化的例子,假设我有一个 CSV 文件(download here):
Mark Rodgers,mark.rodgers@company.com,Accounting
[...]
Melissa Jones,melissa@company.com,CEO
我希望能够使用 JS 读取文件并使用其中的数据来生成我的页面。
到目前为止我所取得的成就:
Demo(右键单击 -> “另存为”将 HTML 保存到您的计算机)。它也可以在 jsfiddle 上以半损坏的方式使用(布局已损坏,但在功能上应该仍然正确)。
只需将 CSV 文本文件拖放到拖放框中,或使用文件菜单选择文本文件,JavaScript 就会读取、解析文件并填充表格。
这依赖于 FileReader API;大部分繁重的工作都是由这个函数完成的:
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、shudders ActiveX)。如果页面位于
file:///,我很确定这些可能无论如何都不起作用
它必须能够接受任意数据。这排除了以可以使用的良好格式加载文件 像 JSON。
如果它适用于 Firefox 或 Chrome 中的任何一个(理想情况下两者都适用),那就没问题了。也可以依赖实验性 API
我事先知道文件名是什么,因此可以在 HTML 本身中对其进行编码。 任何让我能够从磁盘读取文件的解决方案都很好,它不必使用 FileReader API。
因此,如果有一个巧妙的技巧可以将文件加载到页面中也很好(也许将其加载到不可见的 iframe 中并让 JS 检索内容);那也没关系。
【问题讨论】:
-
在 Chrome 中,您应该指定命令行参数
--allow-file-access-from-files以允许访问file://方案。出于安全考虑,我不确定 Chrome 是否允许以任何其他更方便的方式执行此操作。 -
-
不确定,但您可能会对 node-webkit 项目感兴趣。 github.com/rogerwang/node-webkit
-
如果您只需要 mozilla (firefox/seamonkey) 或 chrome,只要网页是也在 file:// - 我用一个例子更新了我的答案(虽然没有检查浏览器,已经有很多例子了)。如果页面本身不在 file:// 上,我很确定它不会起作用(至少它不应该,如果它确实是一个巨大的安全漏洞,应该立即报告)
-
你不只是使用html5离线api有什么原因吗?基本上是一样的,除了你甚至不必在电脑上保存任何东西。另外,FileSystem API 输入文件只需要提示一次。
标签: javascript html file filereader