【问题标题】:Reading local file in javascript [duplicate]在javascript中读取本地文件[重复]
【发布时间】:2014-11-29 16:44:11
【问题描述】:

有没有办法,在客户端浏览器中运行的 JavaScript 中,以下列方式访问本地文件进行 IO?该文件被定期附加(每~25ms)。我们希望读取每一个新行。最好是在附加任何内容时异步(我们得到某种信号,或执行回调)。这可能吗?如果有,怎么做?

我对 Javascript 的经验仅限于 D3,因此我们将不胜感激就如何或为什么/为什么不可行的基本解释。由于安全原因,我完全可以理解这是不可能的。

编辑:为了清楚起见,该文件位于客户端计算机上。该文件只是一个文本文件。附加到它的进程是客户端机器上的本机进程。

【问题讨论】:

  • 你可以通过搜索旧的堆栈溢出页面找到答案
  • 是的,您可以使用 AJAX。
  • 客户端机器中的本地文件?这不会构成安全威胁吗?
  • 我就是这么想的。如有必要,我们可以让客户端上传文件,但这是否允许我们获取上传后附加的内容?
  • @RamithJayatilleka 我真正能想到的唯一解决方案是创建一个完整的扩展程序(如 google chrome 扩展程序或 firefox 扩展程序),它可以与您的本机进程通信。

标签: javascript file-io local-storage


【解决方案1】:

答案不是真的,不。

但是有一些变通方法,取决于您可以摆脱什么(支持的浏览器等)

当您获取本地文件时(我假设您使用的是 <input type="file">,而不是部分支持的非标准化方法),您会收到一个要订阅的 "change" 事件,但该更改反映了所选内容的更改文件,而不是更改特定文件的内容。

除此之外,如果您有一个继承自 BlobBlobFile,那么您基本上就有一个充满数据的缓冲区。

该缓冲区不会根据操作系统其他地方的变化动态更新自身,也不支持这样做的回调选项。

或者,对于 blob 或文件,您可以选择使用 URL.createObjectURL( file ),它会返回一个临时 url,它引用一个文件,而不是文件的内容。

也就是说,对该文件的任何更改都可能会反映在对该 URI 的后续调用中。
这不是我为测试而构建的东西。

不会有回调;但是,您可以设置基于间隔的心跳,对那个 URI 进行 XHR 调用,然后将 .responseText 与之前的 .responseText 进行比较。

同样,不能保证,但这与我认为您现在将得到的答案一样接近(虽然仍处于无插件/无扩展解决方案的领域),并且可能只值得花一个小时制定一个原型,以及更多测试支持(链接是否有效,而不是初始表示等)。

var input = document.querySelector("input[type='file']"), // client must open file, themselves
    fileHandle = "", // this will be the url for the local file
    content    = "", // this will be the latest contents of the file
    previousContent = ""; // this will be the previous contents

var ms = 1000,
    secs = 2,

    pollId; // will be the process ID for the polling (so you can stop checking for changes, later).

// wait for a file to be selected
input.addEventListener("change", function (evt) {

    var file = evt.target.files[0]; // grab the file object
    fileHandle = URL.createObjectURL(file); // create a url which points to the local file

    // create an interval to check for changes
    pollId = setInterval(
        getLatest(fileHandle, getCurrent, updateCurrent),
        secs * ms
     );
});

function updateCurrent (latest) {
    current = latest;
    doStuff(current);
    // the text has changed; it's been updated;
    // now call home or do something else
}

function getCurrent () { return current; }

function getLatest (url, getCurrent, onchange) {
    return function () {
        // this isn't actually calling the network
        // it's calling the local file
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url);

        xhr.onload = function () {
            var latest = xhr.responseText;
            if (getCurrent() !== latest) { onchange(latest); }
        };

        xhr.send();
    };
}

您现在可以在支持的浏览器中进行更改轮询。

【讨论】:

  • 谢谢。我发现了一些其他方法(对于本机应用程序)可以很容易地完成我想要做的事情,所以现在我沿着这个方向前进,但我可能会做出原型。
猜你喜欢
  • 2014-02-26
  • 2018-07-09
  • 2017-06-24
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多