2017-08-28 184 views
9

我創建一個Web擴展和從XUL移植。我曾經可以很容易地閱讀文件Firefox網頁擴展 - 讀取本地文件(上次下載的文件)

var dJsm = Components.utils.import("resource://gre/modules/Downloads.jsm").Downloads; 
    var tJsm = Components.utils.import("resource://gre/modules/Task.jsm").Task; 
    var fuJsm = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils; 
    var nsiPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); 

    .... 

    NetUtil.asyncFetch(file, function(inputStream, status) { 
      if (!Components.isSuccessCode(status)) { 
      return; 
      } 
      var data = NetUtil.readInputStreamToString(inputStream, inputStream.available()); 
      var data = window.btoa(data); 
      var encoded_data_to_send_via_xmlhttp = encodeURIComponent(data); 
      ... 
    }); 

這將被棄用。

我可以使用downloads.download()知道什麼是最後下載,但我無法讀取該文件,然後得到encoded_data_to_send_via_xmlhttp

而且在Firefox 57起等價,意味着我必須嘗試通過按鈕點擊或者其他東西來僞造用戶操作,或者上傳文件。

Access to file:// URLs or reading files without any explicit user input 

是不是有一個簡單的方法來讀取上次下載的文件?

+0

從url中讀取文件eg 「/下載/隨機的。txt' - 這是什麼必須閱讀,然後發佈 – user1320651

+0

請參閱[本文](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Working_with_files)中的信息以及鏈接的代碼例子。 – K3N

+0

沒有幫助。無論如何我無法讀取文件 – user1320651

回答

6

WebExtension API不允許擴展來讀取本地文件了。您可以讓擴展名獲得CORS特權,並通過fetch()XMLHttpRequest()直接從URL中讀取內容並直接存儲到IndexedDB或內存,然後編碼併發送到服務器。這與many restrictions and limitations一起,例如您可以讀取哪些來源等等。

此外,這可能會增加許多不必要的步驟。如果目的似乎是在目前的問題中,與服務器共享下載的文件,我會建議您獲取最後一個DownloadItem對象,從該對象中提取URL(.url)併發送URL回到服務器。

這樣服務器可以直接從該URL加載(並在需要時將其在服務器上編碼)。網絡負載將大致相同(實際上稍微少一點,因爲沒有涉及Base64編碼,這增加了33%的大小),並且客戶端上的負載要少得多。服務器將讀取數據作爲二進制/字節數據流;大約與數據直接從分機發送一樣。

爲了獲得最後下載的文件,你會怎麼做,從一個特權腳本如下:

browser.downloads.search({ 
    limit: 1, 
    orderBy: ["-startTime"] 
}) 
.then(getLastDownload); 

function getLastDownload(downloads) { 
    if (downloads.length) { 
    var url = downloads[0].url; 
    // ... send url to the server and let server fetch the data from it directly 
    } 
} 
+0

爲了公平起見,我已經表明這在以前的評論中是可能的,但它似乎並沒有解決問題。 – user1320651

+0

我已經看過本地消息傳遞和運行一個小應用程序來爲我做這個咕嚕的工作,但它並不理想,但是由於FF中的MDN準則的安全性,我不能「讀」任何下載的文件。它可能與Web擴展一起安裝應用程序以從下載API獲取參數,然後在本地讀取文件並將其發佈到服務器 – user1320651

+0

另外最後一個browser.downloads.search實際上並沒有實際顯示最後一次下載的時間。如果下載正在進行中,我需要等待這完成然後發送到服務器,所以我選擇使用eventListener而不是 – user1320651

2

this support mozilla question

(2)本地文件的安全性,從網絡服務器上的頁面對本地磁盤或UNC路徑頁

火狐限制訪問。 [...])。

哪種解決方案?

和/或

  • 運行在客戶端的一個小地方的網絡服務器,假設服務器與足夠的權限運行,最終你可以訪問任何地方內容通過http://(但仍不能使用file:///)