Firefox Web扩展 - 读取本地文件(上次下载的文件)

use*_*651 10 firefox xmlhttprequest filereader

我正在创建一个Web扩展并从XUL移植.我曾经能够轻松阅读文件

  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);
            ...
  });
Run Code Online (Sandbox Code Playgroud)

以上内容将被弃用.

我可以使用downloads.download()来了解最后一次下载是什么,但我无法读取该文件,然后获取encode_data_to_send_via_xmlhttp的等效文件

此外,在Firefox 57以上,意味着我必须尝试通过按钮单击或其他东西伪造用户操作,或上传文件.

  Access to file:// URLs or reading files without any explicit user input 
Run Code Online (Sandbox Code Playgroud)

是不是有一个简单的方法来阅读上次下载的文件?

小智 6

WebExtension API不允许扩展程序再读取本地文件.您可以让扩展获得CORS权限并直接从URL读取内容,fetch()或者XMLHttpRequest()作为blob 直接读取内容并直接存储到IndexedDB或内存,然后编码并发送到服务器.这带来了许多限制和限制,例如您可以从哪个来源读取等等.

此外,这可能会增加许多不需要的步骤.如果目的似乎是在目前的问题中,与服务器共享下载的文件,我建议你获取最后一个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
  }
}
Run Code Online (Sandbox Code Playgroud)