我开发了一个Chrome扩展程序,我在其中添加了一个onDeterminingFilename事件的监听器,它会检查下载文件名是否为特定格式,然后重命名并在“另存为”中显示。对话框。
现在我想在Firefox中开发一个类似的扩展,但我无法找到任何可以在文件下载完成之前触发的事件。如果没有这样的事件,任何人都可以建议如何以编程方式重命名文件开始下载?
编辑1: 正如antoyo建议的那样,我已经更新了代码
在这里,我可以创建一个新的下载,以相同的URL和不同的文件名开头,但不能取消现有的下载。我不希望用户两次下载同一个文件。
调用cancel()不会做任何事情。如何取消下载?
或者有没有办法在添加到下载摘要之前访问下载文件?
var self = require('sdk/self');
const { Cc, Ci, Cu } = require('chrome');
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/osfile.jsm")
Cu.import("resource://gre/modules/Task.jsm");
Downloads.getList(Downloads.PUBLIC).then(function(downloadList) {
downloadList.addView({
onDownloadAdded: function(download) {
var fname = download.target.path;
var url = download.source.url;
download.cancel();
// check if name is not be changed
if (true){
label = "filename.txt";
d_path = "/home";
Task.spawn(function () {
yield Downloads.fetch(url, OS.Path.join(d_path, label));
}).then(null, Cu.reportError);
}
download.start().then(function(){
console.log("start");
});
download.launch().then(function(){
console.log("launch");
});
download.whenSucceeded().then(function() {
console.log('WhenSucceeded');
});
},
onDownloadChanged: download => console.log("Changed", download),
onDownloadRemoved: download => console.log("Removed", download)
});
});
答案 0 :(得分:2)
您可以使用Downloads.jsm模块解决您的问题。
要观察下载事件,您需要在DownloadList上添加视图。
之后,您可以使用Download对象执行任何操作。
以下是使用附加SDK的示例代码:
const { Cu } = require('chrome');
Cu.import('resource://gre/modules/Downloads.jsm');
Cu.import('resource://gre/modules/osfile.jsm');
Cu.import('resource://gre/modules/Task.jsm');
Downloads.getList(Downloads.PUBLIC).then(function(downloadList) {
downloadList.addView({
onDownloadAdded: function(download) {
download.cancel();
let filename = download.target.path;
let url = download.source.url;
let name = 'filename.txt';
let directory = '/home';
Task.spawn(function() {
yield Downloads.fetch(url, OS.Path.join(directory, name));
}).then(null, Cu.reportError);
},
});
});
这将取消所有新下载并开始新的下载。