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

2024-04-11

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

我有一个适用于 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,但我愿意接受任何其他浏览器的建议。

Edit:回答“你为什么要这样做?”的问题:

基本上,我想在客户端将文件内容与一次性密码一起哈希,以便我可以将此信息发送回作为验证。


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

由于我最初写了这个答案,File API http://dev.w3.org/2006/webapi/FileAPI/已被提议作为标准在大多数浏览器中实现 http://caniuse.com/#feat=fileapi(从 IE 10 开始,增加了对FileReader此处描述的 API,虽然还不是File应用程序编程接口)。该API比旧的Mozilla API稍微复杂一些,因为它旨在支持异步读取文件,更好地支持二进制文件以及不同文本编码的解码。有Mozilla 开发者网络上提供了一些文档 https://developer.mozilla.org/en/using_files_from_web_applications以及网上的各种例子。您可以按如下方式使用它:

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 http://trac.webkit.org/export/42566/trunk/WebCore/html/File.idl对象有fileName and fileSize。根据提交消息 http://trac.webkit.org/changeset/34702对于文件和文件列表支持,这些的灵感来自Mozilla 的文件对象 https://developer.mozilla.org/en/nsIDOMFile,但它们似乎只支持一部分功能。

如果您想改变这一点,您可以随时发送补丁 http://webkit.org/coding/contributing.html到 WebKit 项目。另一种可能性是提议将 Mozilla API 纳入HTML 5 http://www.whatwg.org/specs/web-apps/current-work/; the WHATWG http://lists.whatwg.org/listinfo.cgi/whatwg-whatwg.org邮件列表可能是最好的地方。如果你这样做,那么至少在几年的时间内,更有可能有一种跨浏览器的方式来做到这一点。当然,提交补丁或纳入 HTML 5 的提案确实意味着需要做一些捍卫这一想法的工作,但 Firefox 已经实现了它,这一事实为您提供了一些开始的机会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在各种浏览器中用javascript读取客户端的文件内容 的相关文章

随机推荐

  • OAuth 2 承载授权标头

    随着客户端 API 的更新 HTTPBasicAuthication 方法已替换为 OAuth2Bearer授权标头 使用旧的 API 我会执行以下操作 NSURLCredential credential NSURLCredential
  • 让 R 停止正在运行的 EC2 机器

    我有一些工作流程 我希望 R 在完成脚本后停止正在运行的 Linux 机器 我可以想到两种类似的方法来做到这一点 以 root 身份运行 R 然后调用system halt 从 root shell 脚本运行 R 可以以任何用户身份运行 R
  • 指数时间复杂度的真实示例

    我正在寻找一个直观的 现实世界的问题示例 该问题需要 最坏情况 指数时间复杂度来解决我正在做的演讲 以下是我提出的其他时间复杂度的示例 其中许多取自这个问题 https stackoverflow com questions 1592649
  • 检查表单是否已提交 - PHP

    检查表单是否已提交以确定是否应该将表单的变量传递给我的验证类的最佳方法是什么 首先我想也许 isset POST 但这总是会返回 true 因为超全局变量在任何地方都被定义 我不想使用以下方式迭代表单的每个元素 if isset POST
  • 如何重现错误“由于暂停纯视频背景媒体以节省电量,播放()请求被中断”?

    介绍 作为我项目的一部分 我有一个接收视频流的播放器 我希望它在流开始和结束时自动播放和自动停止 因此我引入了一个检查来查看流是否处于活动状态并在每种情况下启动和 或停止播放器 这是一个企业网站 有时有多达 3000 名用户同时观看视频流
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • java 的地理图表

    谁能推荐一个 Java 组件 它可以让您创建一个漂亮的世界地图图像 突出显示某些国家 基于一些统计数据 与此图像类似的东西 类似于 Google 地理图表 但适用于 Java https developers google com char
  • Visual Studio Android ApkSigner 在密钥库中找不到密钥

    我在 Visual Studio 中创建 APK 时收到此错误 Failed to load signer signer 1 C googleplay keystore entry googleplay does not contain a
  • 使用pipenv,如何在pipfile中指定最低的python版本?

    Pipenv 有没有办法在 Pipfile 中指定 python 的最低版本 像这样的东西会起作用吗 requires python version gt python 3 5 No pipenv does not支持这一点 每Pipenv
  • xcode 接口生成器对象链接到检查器中的自定义类?

    在Xcode 最新版本 Interfacebuilder中 您可以将对象链接到代码 我创建了一个类 interface FileChangeController NSObject 但它没有在 Interface Builder Inspec
  • ios8 - 如何显示默认共享表

    我想展示并使用默认的 分享到其他服务 表 以便允许分享到 Twitter Facebook 电子邮件等 我不知道如何从我的应用程序中显示此视图 我该怎么做 您可以使用简单的活动控制器来显示默认共享应用程序 NSArray activityI
  • 使用 py2neo 在 neo4j 上查询写入性能

    目前 我正在努力寻找一种高性能的方法 使用 py2neo 运行多个查询 我的问题是 python 中有一大堆需要写入 neo4j 的写入查询 我现在尝试了多种方法来解决这个问题 对我来说最好的工作方法如下 from py2neo impor
  • 在 ninja/cmake 中操纵独立目标的构建顺序

    我正在开发一个使用 cmake ninja 构建的 C 项目 在 64 线程计算机上有大约 1200 个构建目标 有一个翻译单元需要 10 分钟来编译 大多数其他单元都相对较快 因此所有其他目标的构建一起只需要大约 9 分钟 在所有线程上构
  • 通过对具有匹配 id 编号的对象进行分组来重建 NSArray?

    我有一个 NSArray 数组中的每个对象都有一个 groupId 和一个名称 每个对象都是唯一的 但有许多对象具有相同的 groupId 有没有办法可以将数组分开并重建它 以便将名称分组到具有相应 groubId 的单个对象中 这是数组当
  • 获取密封特征的子类

    是否有可能 通过宏 某种形式的无形状自动魔法或其他形式 获得密封特征的子类列表 在编译时 在运行时 您不需要任何第三方库来执行此操作 sealed trait MyTrait case object SubClass1 extends My
  • 使用 C# 搜索 CSV 文件并提取旁边列中的值

    我正在尝试编写一个我正在编写的程序 Visual Studio 中的 C 在外部 CSV 文件中查找值 并将下一列中的值拉回到我的 WinForm 中的标签中 我的 CSV 文件是使用虚拟数据进行的测试 如下 gt old newuser
  • 如何获取 pexpect 日志文件中的时间戳

    我在用pexpect处理我的 telnet 和 ssh 通信 我还将所有请求 响应写入logfile using pexpect logfile filename 我想拥有时间戳也在日志文件中 我在文档中找不到它 有谁知道如何实现此功能 l
  • 这就是 C 中 + 运算符的实现方式吗?

    当理解原始运算符如 and 是用C实现的 我发现了以下片段一个有趣的答案 https stackoverflow com a 11694778 5399734 replaces the operator int add int x int
  • 从抓取的网页获取页面标题[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions var h
  • 在各种浏览器中用javascript读取客户端的文件内容

    我试图提供一个仅脚本的解决方案 用于通过浏览器读取客户端计算机上的文件内容 我有一个适用于 Firefox 和 Internet Explorer 的解决方案 这并不漂亮 但我现在只是在尝试 function getFileContents