我正在寻找一种允许用户使用标准元素选择文件的方法,并允许浏览器在页面刷新和/或浏览器实例中持久访问该文件。
情景:
我们不想使用localStorage来存储整个文件,因为文件的最大大小不受限制,并且可能超出localStorage的大小限制。
我已经部分成功:只要原始浏览器选项卡处于打开状态,任何其他浏览器实例或选项卡都可以访问该文件并进行读取。但是,如果关闭原始选项卡,则会破坏本地文件URL。
以下是我做这部分的方法:
每当另一个浏览器实例/选项卡访问此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,而无需保持原始标签保持打开状态,并允许访问同一本地文件,而无需用户每次访问应用程序时都需要手动选择它?
答案 0 :(得分:0)
这与单点登录非常相似,但需要进行额外验证。
这是一个解决方案: