2011-07-12 53 views
7

我是Firefox插件开发的新手,目前它运行良好,但我坚持如何基本上从Web上下载文件,给定URI并将其保存到磁盘。 Mozilla的MDN文档包含有关如何上传文件的信息,但下载文件部分为空且尚未编写。可悲的是,我还没有找到任何文件描述如何做到这一点。使用Firefox插件下载文件

有谁知道如何做到这一点的相关文件?


旧的Facebook相册下载插件使用在其覆盖的JavaScript调用这个函数:

saveURL(images[i].replace(/\/s/g, "/n"), null, null, false, true, null); 

显然,第一个参数是URI请求。 saveURL函数没有在任何地方定义,所以我认为它是一个扩展API函数。我已经在我的新插件中尝试过了,它确实有效。不过,我想知道其他论点的含义。

+0

你见过这个吗? http://stackoverflow.com/questions/3749231/download-file-using-javascript-jquery 我在我的Firefox插件中使用JQuery。 – ysrb

+0

可悲的是,这对我来说并不适用,因为我无法访问有问题的Web服务器,因此无法修改与文件一起发送的MIME类型。必须有一个本地API方法来做到这一点扩展 - 我只是找不到它。 –

+0

@Delan:'saveURL'绝对不是一个API函数 - 它可以在导入的JavaScript模块或类似的东西中定义。 –

回答

5

标准的方式做,这是nsIWebBrowserPersist:

var persist = 
    Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]. 
    createInstance(Ci.nsIWebBrowserPersist); 
persist.saveURI(serverURI, null, null, null, "", targetFile); 

更多信息,请参见https://developer.mozilla.org/en/Code_snippets/Downloading_Files

+1

从FF 19开始,saveURI已收到第7个参数privacyContext。用法[这里](https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIWebBrowserPersist#saveURI%28%29) – Bora

1

这是一个简单的复制/粘贴选项,适用于任何寻找快速解决方案而无需进一步搞乱的人。把它放在你的main.js中,并改变文件名,目录和url。

function DownloadFile(sLocalFileName, sRemoteFileName) 
{ 
    var saveToDirectory = 'C:\\Users\\louis\\downloads\\'; 

    var chrome = require("chrome"); 

    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);  

} 
DownloadFile("saveAsThis.mp3","http://domain.com/file.mp3");