首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firefox扩展-读取本地文件(上次下载的文件)

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

Stack Overflow用户
提问于 2017-08-28 12:35:04
回答 2查看 1.1K关注 0票数 9

我正在创建一个web扩展,并从XUL移植。我以前可以很容易地读取文件

代码语言:javascript
运行
复制
  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上,这意味着我必须尝试通过点击按钮或什么来伪造用户的行为,或者上传一个文件。

代码语言:javascript
运行
复制
  Access to file:// URLs or reading files without any explicit user input 

有没有一种容易的方法来读取最后下载的文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-01 02:54:30

WebExtension API将不再允许扩展名读取本地文件。您可以让扩展获得CORS特权,并通过fetch()XMLHttpRequest()作为blob直接从URL读取内容,并直接存储到IndexedDB或内存中,然后编码并发送到服务器。这是与许多限制和限制一起提供的,例如您可以从哪个来源读取等等。

此外,这可能会增加许多不必要的步骤。如果目的是,就像目前看来是问题所在,将下载的文件与服务器共享,我建议您获得最后一个DownloadItem对象,从该对象中提取URL (.url)并将该URL发送回服务器。

这样,服务器就可以直接从该URL加载(如果需要的话,可以在服务器上对其进行编码)。网络负载将大致相同(实际上稍微少一点,因为不涉及Base64编码,增加了33%的大小),而客户机上的负载则少得多。服务器将将数据读取为二进制/字节数据流;与直接从扩展发送数据的情况大致相同。

要获得上一次下载的文件,您需要从特权脚本中执行以下操作:

代码语言:javascript
运行
复制
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
  }
}
票数 6
EN

Stack Overflow用户

发布于 2017-09-06 15:13:55

根据这支持mozilla问题的说法。

(2)本地文件安全 Firefox限制从web服务器上的页面访问本地磁盘或UNC路径上的页面。)。

哪种解决方案?

和/或

  • 在客户端运行一个小型本地was服务器,假设服务器以足够的权限运行,您最终可以通过http://访问任何本地内容(但仍然不能使用file:///) )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45919172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档