正在下载SDK加载项中的文件



有很多关于使用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);
}
});

请帮忙!

好吧,我在玩这个的时候也遇到了类似的问题。。我的代码与您的代码非常接近,但我添加了一些有用的步骤。。首先,我从首选项中获取目录路径。然后,如果目录不存在,我会创建它。。在我的情况下,我也在创建子目录,您可能不需要它,但以防万一。

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"
}]

最新更新