【问题标题】:Javascript persistent access to local files across browser instances/page refreshes跨浏览器实例/页面刷新对本地文件的 Javascript 持久访问
【发布时间】:2014-09-16 01:48:48
【问题描述】:

我正在寻找一种方法,允许用户使用标准元素选择文件,并允许浏览器在页面刷新和/或浏览器实例之间持续访问该文件。

场景:

  • 我们有一个 Web 应用程序,我们希望将其授权给用户。
  • 我们希望向用户发送他们保存到本地计算机的许可文件。
  • 他们第一次访问我们的网络应用程序时,会使用一个字段来选择他们计算机上的本地许可证文件
  • 以后每次访问应用(无论是关闭浏览器、重启机器等),都可以直接读取许可文件,无需用户重新选择文件。

我们不想使用 localStorage 来存储整个文件,因为文件的最大大小没有限制,并且可能会超出 localStorage 的大小限制。

我已经部分成功:只要原始浏览器选项卡打开,任何其他浏览器实例或选项卡都可以访问该文件并读取它。但是,如果关闭原始选项卡,则本地文件 URL 被破坏。

这部分我是这样做的:

  • 当用户从字段中选择一个文件时,使用 window.createObjectURL() 函数为所选文件创建一个对象 URL。
  • 将此对象 URL 保存在 localStorage 中

当另一个浏览器实例/选项卡访问此 URL 时,它可以使用 XHR 对象和 FileReader 对象加载文件。这是一段代码:

var xhr = new XMLHttpRequest();
console.log("Reading URL: " + localStorage.savedFile);
xhr.open('GET', localStorage.savedFile, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function(e)
{
    if (xhr.readyState == 4)
    {
        var myBlob = this.response;
        console.log(myBlob);
        var f = new FileReader();
        f.onload = function(e) { console.log(e); alert("Data read: " + e.target.result); };
        f.readAsText(myBlob);

    }
};
xhr.send();

如您所见,xhr 对象返回一个 blob,并且可以将其直接发送到 FileReader 对象以读取数据。

只要原始选项卡(他们选择文件的选项卡)处于打开状态,它就可以完美运行。但显然 createObjectURL() 生成的 URL 在关闭选项卡时会被销毁(从垃圾收集的角度来看这是有道理的)。

任何人都可以想出一种方法来跨实例/选项卡保留 URL,而无需保持原始选项卡保持打开状态,并允许访问相同的本地文件,而无需用户在每次访问应用程序时手动选择它?

【问题讨论】:

  • 另外,我知道 FileSystem API (developer.mozilla.org/en-US/docs/WebGuide/API/…),但它看起来已经死掉了 (lists.w3.org/Archives/Public/public-webapps/2014AprJun/…),而且跨浏览器无法预测。
  • 你最终找到解决方案了吗?
  • 不,很遗憾没有。你有吗?
  • 我可以看到它的多种用途。最好有一个持久的“对象”,可以在指向文件系统对象的浏览器会话/执行之间引用......
  • 这里也一样。目前正在研究是否可以在我的特定场景中使用好的老式 Flash 桥接器(但这绝对不是一般的选择)。

标签: javascript html persistent-storage


【解决方案1】:

这与单点登录非常相似,但需要额外的验证。

这是一种解决方案:

  • 创建许可证的哈希(或加密“许可证密钥”,许可证的一些唯一标识符)
  • 将哈希值存储在 cookie 或本地存储中
  • 还将哈希传递给服务器并保存哈希与客户端之间的映射,以及上次访问的日期/时间
  • 每次用户登录时,验证 cookie 或本地存储是否存在散列条目以及散列的有效性。您可能还需要对上次使用的列表、客户端数量等执行其他验证。

【讨论】:

  • 所以你想不出有什么办法可以持久地直接访问实际的文件?这就是目标。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2021-04-05
  • 2011-07-03
  • 1970-01-01
  • 2021-01-13
  • 2013-02-12
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多