跨浏览器实例/页面刷新的Javascript持久访问本地文件

时间:2014-07-24 13:17:56

标签: javascript html5 persistent-storage

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

情景:

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

我们不想使用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,而无需保持原始标签保持打开状态,并允许访问同一本地文件,而无需用户每次访问应用程序时都需要手动选择它?

1 个答案:

答案 0 :(得分:0)

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

这是一个解决方案:

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