下载SDK附加组件中的文件

时间:2014-01-06 17:08:29

标签: javascript pdf firefox-addon firefox-addon-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);
        }
});

请帮忙!

1 个答案:

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