我正在创建一个web扩展,并从XUL移植。我以前可以很容易地读取文件
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
有没有一种容易的方法来读取最后下载的文件?
发布于 2017-09-01 02:54:30
WebExtension API将不再允许扩展名读取本地文件。您可以让扩展获得CORS特权,并通过fetch()
或XMLHttpRequest()
作为blob直接从URL读取内容,并直接存储到IndexedDB或内存中,然后编码并发送到服务器。这是与许多限制和限制一起提供的,例如您可以从哪个来源读取等等。
此外,这可能会增加许多不必要的步骤。如果目的是,就像目前看来是问题所在,将下载的文件与服务器共享,我建议您获得最后一个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
}
}
发布于 2017-09-06 15:13:55
根据这支持mozilla问题的说法。
(2)本地文件安全 Firefox限制从web服务器上的页面访问本地磁盘或UNC路径上的页面。)。
哪种解决方案?
和/或
https://stackoverflow.com/questions/45919172
复制相似问题