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

问题描述:

我创建一个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

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

this support mozilla question

(2)本地文件的安全性,从网络服务器上的页面对本地磁盘或UNC路径页

火狐限制访问。 [...])。

哪种解决方案?

和/或

  • 运行在客户端的一个小地方的网络服务器,假设服务器与足够的权限运行,最终你可以访问任何地方内容通过http://(但仍不能使用file:///)