2014-07-24 19 views
3

我正在尋找一種方法來允許用戶使用標準元素選擇文件,並允許瀏覽器跨頁刷新持續訪問該文件和/或瀏覽器實例。Javascript持久訪問跨瀏覽器實例的本地文件/頁面刷新

場景:

  • 我們有,我們要授權給用戶一個Web應用程序。
  • 我們希望將用戶保存的許可證文件發送給本地計算機。
  • 他們訪問我們的Web應用程序的第一次,他們使用的字段選擇其計算機
  • 他們訪問應用程序(它們是否關閉瀏覽器,重新啓動計算機等),其後每一次在本地許可文件,它可以直接讀取許可證文件,而無需用戶重新選擇文件。

我們不希望使用localStorage來存儲整個文件,因爲文件的最大大小不受限制,並且可能會超出localStorage的大小限制。

我已經部分成功:只要原始瀏覽器選項卡打開,任何其他瀏覽器實例或選項卡都可以訪問該文件並讀取它。但是,如果原始選項卡關閉,則本地文件URL將被銷燬。

以下是我做的很:

  • 當用戶從一個領域的文件,使用window.createObjectURL()函數來選定文件創建一個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不需要保持原始選項卡打開,並允許訪問相同的本地文件,而無需用戶每次訪問時手動選擇它應用程序嗎?

+0

另外,我知道FileSystem API(https://developer.mozilla.org/en-US/docs/WebGuide/API/File_System#Browser_Compatibility),但它看起來已經死了(http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0010.html),並且在瀏覽器中不可預知。 –

+0

您最終找到了解決方案嗎? –

+0

不,不幸的不是。你是否? –

回答

0

這與單點登錄非常相似,但需要額外的驗證。

這是一個解決辦法:

  • 創建許可證的散列(或加密「許可證」,許可證的一些獨特的標識符)
  • 存儲在cookie或本地存儲
  • 哈希
  • 同時將散列傳遞給服務器,並保存散列和客戶端之間的映射以及上次訪問的日期/時間
  • 每次用戶登錄時,驗證cookie或本地存儲是否存在散列條目和散列的有效性。您可能還想執行上次使用的其他驗證列表,最後使用的客戶端數量等。
+0

所以你不能想出任何方式來持久地直接訪問實際的*文件*這就是目標。 –