Firefox WebExtensions,按路径获取本地文件内容

Sab*_*baz 12 javascript firefox-addon-webextensions

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

这个附加组件应该通过它的绝对路径读取本地文件内容:
"/ home/saba/desktop/test.txt"

的manifest.json

{

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

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

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

}
Run Code Online (Sandbox Code Playgroud)


这是我到目前为止尝试过的(在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");
Run Code Online (Sandbox Code Playgroud)

失败.我无法弄清楚为什么它总是返回一个空响应
(test.txt包含"test",路径是正确的)

onloadend XMLHttpRequest { 
    onreadystatechange: null, 
    readyState: 4, 
    timeout: 0, 
    withCredentials: false, 
    upload: XMLHttpRequestUpload, 
    responseURL: "", 
    status: 0, 
    statusText: "", 
    responseType: "", 
    response: "" 
}
Run Code Online (Sandbox Code Playgroud)




运用 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");
Run Code Online (Sandbox Code Playgroud)

但在这里我因为这个file论点而陷入困境.
这种方法通常与一个input type="file"标记相同,后者返回一个.files数组.(但我只有一个本地路径字符串)

我搜索了是否可以使用绝对本地文件路径创建一个新的BlobFilevar,但是它不可能接缝.




运用 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附加组件的绝对路径获取本地文件的内容?

Sab*_*baz 12

我终于找到了使用Fetch请求FileReader 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); 
    });
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

});
Run Code Online (Sandbox Code Playgroud)

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

使用它:

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

  • 该解决方案在 Firefox 57 上不再起作用,它给我错误“尝试获取资源时出现 TypeError: NetworkError”。有什么见解吗? (2认同)
  • @beaver因此,我在Windows上使用该方法进行了一些尝试,作为最后的回答,我可以说“是的,但是...”。确实确实有某些因素阻止Firefox读取某些文件夹中的文件(也许是在较新版本的firefox中引入的某种用户R / W访问控制?)。例如,可以从根文件夹(C:\)读取,而从桌面或文档读取则没有问题。我注意到了文件夹权限中的某些内容(右键单击&gt;属性&gt;安全性)。在可能读取文件的位置,“用户和组”中列出了“所有人”。 (2认同)