javascript - 在各种浏览器中使用 javascript 在客户端读取文件内容

标签 javascript html file-io sandbox

我正在尝试提供一种纯脚本解决方案,用于通过浏览器读取客户端计算机上的文件内容。

我有一个适用于 Firefox 和 Internet Explorer 的解决方案。它不是很漂亮,但我现在只是在尝试:

function getFileContents() {
    var fileForUpload = document.forms[0].fileForUpload;
    var fileName = fileForUpload.value;

    if (fileForUpload.files) {
        var fileContents = fileForUpload.files.item(0).getAsBinary();
        document.forms[0].fileContents.innerHTML = fileContents;
    } else {
        // try the IE method
        var fileContents = ieReadFile(fileName);
        document.forms[0].fileContents.innerHTML = fileContents;
    }
}       

function ieReadFile(filename) 
{
    try
    {
        var fso  = new ActiveXObject("Scripting.FileSystemObject"); 
        var fh = fso.OpenTextFile(filename, 1); 
        var contents = fh.ReadAll(); 
        fh.Close();
        return contents;
    }
    catch (Exception)
    {
        return "Cannot open file :(";
    }
}

我可以调用 getFileContents(),它将内容写入 fileContents 文本区域。

有没有办法在其他浏览器中执行此操作?

目前我最关心的是 Safari 和 Chrome,但我愿意接受任何其他浏览器的建议。

编辑:在回答“你为什么要这样做?”这个问题时:

基本上,我想在客户端对文件内容和一次性密码进行哈希处理,这样我就可以将此信息发回作为验证。

最佳答案

编辑以添加有关文件 API 的信息

由于我最初写了这个答案,File API已被提议作为标准和implemented in most browsers (从 IE 10 开始,它添加了对此处描述的 FileReader API 的支持,但还不支持 File API)。该 API 比旧的 Mozilla API 稍微复杂一些,因为它旨在支持异步读取文件、更好地支持二进制文件和不同文本编码的解码。有 some documentation available on the Mozilla Developer Network以及各种在线示例。您将按如下方式使用它:

var file = document.getElementById("fileForUpload").files[0];
if (file) {
    var reader = new FileReader();
    reader.readAsText(file, "UTF-8");
    reader.onload = function (evt) {
        document.getElementById("fileContents").innerHTML = evt.target.result;
    }
    reader.onerror = function (evt) {
        document.getElementById("fileContents").innerHTML = "error reading file";
    }
}

原始答案

在 WebKit(因此,Safari 和 Chrome)中似乎没有办法做到这一点。唯一的键 File对象有 fileNamefileSize。根据commit message对于 File 和 FileList 支持,这些灵感来自 Mozilla's File object , 但它们似乎只支持部分功能。

如果您想更改此设置,您可以随时 send a patch到 WebKit 项目。另一种可能性是提议将 Mozilla API 包含在 HTML 5 中。 ; WHATWG邮件列表可能是最好的地方。如果你这样做,那么至少在几年后,更有可能有一种跨浏览器的方式来做到这一点。当然,提交补丁或提议以包含到 HTML 5 中确实意味着需要做一些捍卫这个想法的工作,但 Firefox 已经实现它的事实为您提供了一些起点。

关于javascript - 在各种浏览器中使用 javascript 在客户端读取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750032/

相关文章:

javascript - 动态创建网点

Python Markdown : Markdown Inside HTML Blocks

html - 修复了 AdminLTE 中的内容 header

c# - 启动时打开文件

c - 如何在 C 中打开或创建具有权限的 .out 文件

javascript - Babeljs 为正则表达式 {m,n} 量词产生意外错误

javascript - 在 AngularJS 中更改 URL 而不重新加载

javascript - 视差滚动文本在第一次滚动时跳到顶部

javascript - 如何让这段代码根据点击的内容表现不同?

c++ - 我是否需要定义 ">>"运算符才能将 cin 与 Int32 一起使用?