关于使用addon sdk下载文件的主题很多,但我尝试从几天开始处理这个问题,但我什么都没得到......
好的,我在FireFox上在线工作AddOn Builder,我希望得到这样的东西: 链接pdf - >我点击鼠标右键 - >选择“获取PDF” - > pdf正在下载到f.e. “C:\ TEMP \”
我创建了许多示例代码,但每个代码都不起作用。
我没有任何错误,一切都建好了,但当我点击“获取PDF”时,没有保存在“c:\ temp \”文件夹中。
每个代码都相似,所以我粘贴其中两个:
这是我的exports.main = function()
const { Cc, Ci, Cu } = require('chrome');
var contextMenu = require("sdk/context-menu");
var menuItem = contextMenu.Item({
label: "Get PDF",
context: contextMenu.SelectorContext(" a[href *= '.pdf']"),
contentScript: 'self.on("click", function (node, data) {' +
' self.postMessage("test.pdf", "link to pdf");' +
'});',
onMessage: function (sLocalFileName, sRemoteFileName)
{
var saveToDirectory = 'C:\\temp\\';
//var chrome = require("chrome");
var oIOService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService)
var oLocalFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
oLocalFile.initWithPath(saveToDirectory + sLocalFileName);
var oDownloadObserver = {onDownloadComplete: function(nsIDownloader, nsresult, oFile) {console.log('download complete...')}};
var oDownloader = Cc["@mozilla.org/network/downloader;1"].createInstance();
oDownloader.QueryInterface(Ci.nsIDownloader);
oDownloader.init(oDownloadObserver, oLocalFile);
var oHttpChannel = oIOService.newChannel(sRemoteFileName, "", null);
oHttpChannel.QueryInterface(Ci.nsIHttpChannel);
oHttpChannel.asyncOpen(oDownloader, oLocalFile);
}
});
第二
const { Cc, Ci, Cu } = require('chrome');
var contextMenu = require("sdk/context-menu");
var menuItem = contextMenu.Item({
label: "Get PDF",
context: contextMenu.SelectorContext(" a[href *= '.pdf']"),
contentScript: 'self.on("click", function (node, data) {' +
' self.postMessage(node.href);' +
'});',
onMessage: function (links)
{
// download from: aURLToDownload
var downloadURI = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI(links, null, null);
// download destination
var outputFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
outputFile.initWithPath("c:\\temp\\1.pdf");
var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist);
persist.saveURI(downloadURI, null, null, null, "", outputFile);
}
});
请帮忙!
答案 0 :(得分:1)
好吧,当我玩这个时,我遇到了类似的问题..我的代码非常接近你所拥有但我添加了一些有用的步骤。首先,我从首选项中获取目录路径。然后我实际上创建了目录,如果它不存在。在我的情况下,我也创建子目录,你可能不需要它,但以防万一。
function DownloadFile(sdirectory, sLocalFileName, sRemoteFileName)
{
var baseDirectory = require('sdk/simple-prefs').prefs['downloadpath'] + "\\";
var saveToDirectory = baseDirectory + sdirectory + '\\';
var oLocalDir = chrome.Cc["@mozilla.org/file/local;1"].createInstance(chrome.Ci.nsILocalFile);
oLocalDir.initWithPath(saveToDirectory);
if(!oLocalDir.exists())
{
oLocalDir.create(1,777);
}
var oIOService = chrome.Cc["@mozilla.org/network/io-service;1"].getService(chrome.Ci.nsIIOService)
var oLocalFile = chrome.Cc["@mozilla.org/file/local;1"].createInstance(chrome.Ci.nsILocalFile);
oLocalFile.initWithPath(saveToDirectory + sLocalFileName);
var oDownloadObserver = {onDownloadComplete: function(nsIDownloader, nsresult, oFile)
{
console.log('download complete...');
}};
var oDownloader = chrome.Cc["@mozilla.org/network/downloader;1"].createInstance();
oDownloader.QueryInterface(chrome.Ci.nsIDownloader);
oDownloader.init(oDownloadObserver, oLocalFile);
var oHttpChannel = oIOService.newChannel(sRemoteFileName, "", null);
oHttpChannel.QueryInterface(chrome.Ci.nsIHttpChannel);
oHttpChannel.asyncOpen(oDownloader, oLocalFile);
}
如果你还没有,你应该做的第一件事,转到about:config并将devtools.errorconsole.enabled更改为true。
接下来在下载事件的开头添加一个日志语句。我实际上建议你打破这个方法,然后在你的事件中调用DownloadFile方法。
我发现最重要的事情就是清理我的文件名..用
var file = "somefilename"
file = file.replace(/[/\\:?<>|\"]+/g, "");
如果文件名中包含非法字符,或者目录路径错误,我就有同样的问题。
所以我会让你的代码像..
....
onMessage: function (filename, fileURL)
{
console.log("Message Event, filename: " + filename +" URL: " +fileURL);
DownloadFile(filename,fileURL);
}});
function DownloadFile(sLocalFileName, sRemoteFileName)
{
var baseDirectory = require('sdk/simple-prefs').prefs['downloadpath'] + "\\";
var saveToDirectory = baseDirectory;
var oLocalDir = chrome.Cc["@mozilla.org/file/local;1"].createInstance(chrome.Ci.nsILocalFile);
oLocalDir.initWithPath(saveToDirectory);
if(!oLocalDir.exists())
{
oLocalDir.create(1,777);
}
var oIOService = chrome.Cc["@mozilla.org/network/io-service;1"].getService(chrome.Ci.nsIIOService)
var oLocalFile = chrome.Cc["@mozilla.org/file/local;1"].createInstance(chrome.Ci.nsILocalFile);
oLocalFile.initWithPath(saveToDirectory + sLocalFileName);
var oDownloadObserver = {onDownloadComplete: function(nsIDownloader, nsresult, oFile) {console.log('download complete...')}};
var oDownloader = chrome.Cc["@mozilla.org/network/downloader;1"].createInstance();
oDownloader.QueryInterface(chrome.Ci.nsIDownloader);
oDownloader.init(oDownloadObserver, oLocalFile);
var oHttpChannel = oIOService.newChannel(sRemoteFileName, "", null);
oHttpChannel.QueryInterface(chrome.Ci.nsIHttpChannel);
oHttpChannel.asyncOpen(oDownloader, oLocalFile);
}
编辑: 忘了在package.json文件中提到你需要这个,以便能够设置和检索首选项。
"preferences": [{
"name": "downloadpath",
"title": "Download Path",
"description": "Select a directory to download",
"type": "directory"
}]