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中):
XMLHttpRequestfunction 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)
FileReaderfunction 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数组.(但我只有一个本地路径字符串)
我搜索了是否可以使用绝对本地文件路径创建一个新的Blob或Filevar,但是它不可能接缝.
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)
如果您更喜欢使用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)