原文:http://hi.baidu.com/xletian/blog/item/8b40232ebd755b404fc2268b.html

下载文件

下载一个文件, 创建一个 nsIWebBrowserPersist 的实例并调用它的 saveURI() 方法, 传递给它一个下载的URL和代表本地文件名/路径的 nsIFile 实例。

// create a persist
var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].
createInstance(Components.interfaces.nsIWebBrowserPersist);

// with persist flags if desired See nsIWebBrowserPersist page for more PERSIST_FLAGS.
const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_FROM_CACHE;

// do the save
persist.saveURI(uriToFile, null, null, null, "", nsIFile);

用 Progress Listener下载二进制文件

用自定义progress listener下载二进制文件:

var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
.createInstance(Components.interfaces.nsIWebBrowserPersist);
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\a\\path\\file.bin"); // 下载目的地
var obj_URI = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.newURI(aURLToDownload, null, null);
persist.progressListener = {
onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
var percentComplete = (aCurTotalProgress/aMaxTotalProgress)*100;
var ele = document.getElementById("progress_element");
ele.innerHTML = percentComplete +"%";
},
onStateChange: function(aWebProgress, aRequest, aStatus, aMessage) {
// do something
}
}
persist.saveURI(obj_URI, null, null, null, "", file);

下载需要认证的文件

在调用nsIWebBrowserPersist.saveURI()前, 你需要设置 nsIWebBrowserPersist 实例的progressListener属性为 nsIAuthPrompt对象 。通常, nsIAuthPrompt 会期待显示一个提示框让用户输入认证信息, 但你可以直接返回用户名和密码而不提示用户. 如果你想打开一个登陆提示框,你能调用window watcher的 getNewAuthPrompter()方法。

TODO: 此代码需要测试

var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].
createInstance(Components.interfaces.nsIWebBrowserPersist);
var hardCodedUserName = "ericjung";
var hardCodedPassword = "foobar";
persist.progressListener = {
// implements nsIAuthPrompt
prompt: function(dialogTitle, text, passwordRealm, savePassword, defaultText, result) {
result.value = hardCodedPassword;
return true;
},
promptPassword: function(dialogTitle, text, passwordRealm, savePassword, pwd) {
pwd.value = hardCodedPassword;
return true;
},
promptUsernameAndPassword: function(dialogTitle, text, passwordRealm, savePassword, user, pwd) {
user.value = hardCodedUserName;
pwd.value = hardCodedPassword;
return true;
}
};
persist.saveURI(urlToFile, null, null, null, "", nsFileInstance);

下载图片

从一个URL下载图片的简单函数。

// 接受一个URL,返回文件
// 如果文件没找到(404错误)返回empty.
//试试
.jpg, .ico, .gif (甚至 .html).

function GetImageFromURL(url) {
var ioserv = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var channel = ioserv.newChannel(url, 0, null);
var stream = channel.open();

if (channel instanceof Components.interfaces.nsIHttpChannel && channel.responseStatus != 200) {
return "";
}

var bstream = Components.classes["@mozilla.org/binaryinputstream;1"]
.createInstance(Components.interfaces.nsIBinaryInputStream);
bstream.setInputStream(stream);

var size = 0;
var file_data = "";
while(size = bstream.available()) {
file_data += bstream.readBytes(size);
}

return file_data;
}

下载观测器

Sample download observer for Firefox 2 Download manager.

// ******************************
// DownloadObserver
// ******************************
function sampleDownload_init(){
//**** Add download observer
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
observerService.addObserver(sampleDownloadObserver, "dl-start", false);
observerService.addObserver(sampleDownloadObserver, "dl-done", false);
observerService.addObserver(sampleDownloadObserver, "dl-cancel", false);
observerService.addObserver(sampleDownloadObserver, "dl-failed", false);

window.addEventListener("unload", function() {
observerService.removeObserver(sampleDownloadObserver, "dl-start");
observerService.removeObserver(sampleDownloadObserver, "dl-done");
observerService.removeObserver(sampleDownloadObserver, "dl-cancel");
observerService.removeObserver(sampleDownloadObserver, "dl-failed");
}, false);
}
var sampleDownloadObserver = {
observe: function (subject, topic, state) {
var oDownload = subject.QueryInterface(Components.interfaces.nsIDownload);
//**** Get Download file object
var oFile = null;
try{
oFile = oDownload.targetFile; // New firefox 0.9+
} catch (e){
oFile = oDownload.target; // Old firefox 0.8
}
//**** Download Start
if (topic == "dl-start"){
alert('Start download to - '+oFile.path);
}
//**** Download Cancel
if(topic == "dl-cancel"){
alert('Canceled download to - '+oFile.path);
}
//**** Download Failed
else if(topic == "dl-failed"){
alert('Failed download to - '+oFile.path);
}
//**** Download Successs
else if(topic == "dl-done"){
alert('Done download to - '+oFile.path);
}
}
}
window.addEventListener("load", sampleDownload_init, false);
转:http://fregen.yo2.cn/articles/firefox-%E6%89%A9%E5%B1%95%E5%BC%80%E5 %8F%91%EF%BC%88%E5%85%AB%EF%BC%89%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6.html

posted on 2011-11-02 14:18  hotty  阅读(503)  评论(0)    收藏  举报