use*_*651 10 firefox xmlhttprequest filereader
我正在创建一个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);
...
});
Run Code Online (Sandbox Code Playgroud)
以上内容将被弃用.
我可以使用downloads.download()来了解最后一次下载是什么,但我无法读取该文件,然后获取encode_data_to_send_via_xmlhttp的等效文件
此外,在Firefox 57以上,意味着我必须尝试通过按钮单击或其他东西伪造用户操作,或上传文件.
Access to file:// URLs or reading files without any explicit user input
Run Code Online (Sandbox Code Playgroud)
是不是有一个简单的方法来阅读上次下载的文件?
小智 6
WebExtension API不允许扩展程序再读取本地文件.您可以让扩展获得CORS权限并直接从URL读取内容,fetch()或者XMLHttpRequest()作为blob 直接读取内容并直接存储到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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |