【问题标题】:Firefox WebExtensions, get local files content by pathFirefox WebExtensions,通过路径获取本地文件内容
【发布时间】:2017-02-08 09:06:07
【问题描述】:

我正在尝试使用WebExtensions 结构为Firefox 编写一个小插件。

此插件应通过其绝对路径读取本地文件内容:
"/home/saba/desktop/test.txt"

ma​​nifest.json

{

    "manifest_version": 2,
    "name": "Test - load files",
    "version": "0.0.1",

    "description": "Test - load files",
    "permissions": [ "<all_urls>" ],

    "background": {
        "scripts": [ "main.js" ]
    }

}


到目前为止我尝试过的内容(在 main.js 中):



使用XMLHttpRequest

function readFileAjax(_path){

    var xhr = new XMLHttpRequest();

    xhr.onloadend = function(event) {
        console.log("onloadend", this);
    };

    xhr.overrideMimeType("text/plain");
    xhr.open("GET", "file:///"+_path);
    xhr.send();
}

readFileAjax("/home/saba/desktop/test.txt");

失败。 我不明白为什么它总是返回一个空响应
(test.txt包含“test”,路径正确)

onloadend XMLHttpRequest { 
    onreadystatechange: null, 
    readyState: 4, 
    timeout: 0, 
    withCredentials: false, 
    upload: XMLHttpRequestUpload, 
    responseURL: "", 
    status: 0, 
    statusText: "", 
    responseType: "", 
    response: "" 
}




使用FileReader

function readFileFR(_path){

    var reader  = new FileReader();

    reader.addEventListener("loadend", function() {
       console.log("loadend", this.result)
    });

    reader.readAsText(file);  // file ???? 
}

readFileFR("/home/saba/desktop/test.txt");

但由于file 参数,我在这里卡住了。
此方法通常与返回 .files 数组的 input type="file" 标记配合使用。 (但我只有一个本地路径字符串)

我搜索了是否可以使用绝对本地文件路径创建新的 BlobFile var,但似乎不可能。




使用WebExtensions API

我没有从文档页面中找到有关如何执行此操作的任何线索。

难道没有(可能)某种WebExtensions API 可以像在SDK 中那样实现这一点吗?
https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/io_file
https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/io_text-streams




我做错了什么或错过了什么?

..是否可以通过 WE Add-on 的绝对路径获取本地文件的内容?

【问题讨论】:

  • 'file:///'+_path 会导致file:////home/saba/desktop/test.txt - 我认为那里也可能有/
  • 我尝试删除 / ,不幸的是同样的结果
  • 可能使用 file:// 网址。
  • 没有用于打开文件的 WebExtension API,另请参阅 bugzilla.mozilla.org/show_bug.cgi?id=1246236。你可以使用&lt;input type=file&gt;
  • @evilpie ..所以我正在尝试做的事情没有解决方案(atm)。我会继续使用 SDK 插件,即使他们要弃用它。

标签: javascript firefox-addon-webextensions


【解决方案1】:

我终于找到了使用Fetch requestsFileReader API 的方法。

这是我想出的:

function readFile(_path, _cb){

    fetch(_path, {mode:'same-origin'})   // <-- important

    .then(function(_res) {
        return _res.blob();
    })

    .then(function(_blob) {
        var reader = new FileReader();

        reader.addEventListener("loadend", function() {
            _cb(this.result);
        });

        reader.readAsText(_blob); 
    });
};

使用我的问题中的示例,这是如何使用它:

readFile('file:///home/saba/desktop/test.txt', function(_res){

    console.log(_res); // <--  result (file content)

});

带有承诺的 ES6

如果您更喜欢使用Promises 而不是回调:

let readFile = (_path) => {
    return new Promise((resolve, reject) => {
        fetch(_path, {mode:'same-origin'})
            .then(function(_res) {
                return _res.blob();
            })
            .then(function(_blob) {
                var reader = new FileReader();

                reader.addEventListener("loadend", function() {
                    resolve(this.result);
                });

                reader.readAsText(_blob);
            })
            .catch(error => {
                reject(error);
            });
    });
};

使用它:

readFile('file:///home/saba/desktop/test.txt')
    .then(_res => {
        console.log(_res); // <--  result (file content)
    })
    .catch(_error => {
        console.log(_error );
    });

【讨论】:

  • 这个解决方案在 Firefox 57 上不再有效,它给了我错误TypeError: NetworkError when attempting to fetch resource。有什么见解吗?
  • @beaver 你在 WebExtensions 项目中使用它吗?我在 Firefox 58 上尝试了一个干净的项目,它似乎可以工作。我在这里发布了测试https://github.com/Lor-Saba/webextensions-readfile-from-path。尝试在浏览器控制台中执行代码时遇到同样的错误
  • 感谢您的支持。我也在 Firefox 57 和 58 上尝试过你的测试扩展,但我有同样的错误TypeError: NetworkError when attempting to fetch resource。请注意,我使用的是 Windows。
  • @beaver 所以,我在 Windows 上使用了该方法,作为我的最终回应,我可以说“是的,它有效......但是”。确实有一些东西阻止了 Firefox 读取某些文件夹中的文件(可能是在新版本的 Firefox 中引入了某种用户 R/W 访问控制?)。例如,可以从根文件夹 ( C:\ ) 中毫无问题地读取,但不能从桌面或文档中读取。我从文件夹权限中注意到了一些东西(右键单击>属性>安全)。在可以读取文件的地方,“用户和组”中列出了“所有人”。
  • 你好。我面临类似的需求。如果它对我有用,我会测试这个解决方案。我想问:自提出问题以来已经过去快一年了,仍然可以使用这种方法吗?它可以在现代 Firefox 中运行吗?
【解决方案2】:

这不起作用,或者至少不再考虑接受的答案。

插件在假根中运行,这意味着您只能访问已经存在的文件

  1. 随您的扩展 [1] 一起使用,例如fetch() 或
  2. 打开的交互式(意味着由用户使用文件启动 选择器或拖放)通过 File() 构造函数 [2]

其他一切都会导致Security Error: Content at moz-extension://... may not load data from file:///... 导致 fetch() 抛出上述TypeError: NetworkError when attempting to fetch resource.

[1]https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/web_accessible_resources
[2]https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Working_with_files#open_files_in_an_extension_using_a_file_picker

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多