Downloading files
To download a file, create an instance of nsIWebBrowserPersist
and call its nsIWebBrowserPersist.saveURI()
method, passing it a URL to download and an nsIFile
instance representing the local file name/path.
02
var
persist = Components.classes[
"@mozilla.org/embedding/browser/nsWebBrowserPersist;1"
]
03
.createInstance(Components.interfaces.nsIWebBrowserPersist);
06
const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
07
const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
08
persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_FROM_CACHE;
11
persist.saveURI(uriToFile,
null
,
null
,
null
,
""
, nsIFile);
If you don't need detailed progress information, you might be happier with nsIDownloader
.
Downloading Binary Files with a Progress Listener
To download a binary file with custom progress listener:
01
var
persist = Components.classes[
"@mozilla.org/embedding/browser/nsWebBrowserPersist;1"
]
02
.createInstance(Components.interfaces.nsIWebBrowserPersist);
03
var
file = Components.classes[
"@mozilla.org/file/local;1"
]
04
.createInstance(Components.interfaces.nsILocalFile);
05
file.initWithPath(
"C://a//path//file.bin"
);
06
var
obj_URI = Components.classes[
"@mozilla.org/network/io-service;1"
]
07
.getService(Components.interfaces.nsIIOService)
08
.newURI(aURLToDownload,
null
,
null
);
09
persist.progressListener = {
10
onProgressChange:
function
(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
11
var
percentComplete = (aCurTotalProgress/aMaxTotalProgress)*100;
12
var
ele = document.getElementById(
"progress_element"
);
13
ele.innerHTML = percentComplete +
"%"
;
15
onStateChange:
function
(aWebProgress, aRequest, aStateFlags, aStatus) {
19
persist.saveURI(obj_URI,
null
,
null
,
null
,
""
, file);
Downloading files that require credentials
Before calling nsIWebBrowserPersist.saveURI()
, you need to set the progressListener
property of the nsIWebBrowserPersist
instance to an object that implements nsIAuthPrompt
. Normally, nsIAuthPrompt
expects a prompt to be displayed so the user can enter credentials, but you can return a username and password credentials directly without prompting the user. If you want to open a login prompt, you can use the default prompt by calling the window watcher's getNewAuthPrompter()
method.
01
var
persist = Components.classes[
"@mozilla.org/embedding/browser/nsWebBrowserPersist;1"
]
02
.createInstance(Components.interfaces.nsIWebBrowserPersist);
03
var
hardCodedUserName =
"ericjung"
;
04
var
hardCodedPassword =
"foobar"
;
05
persist.progressListener = {
07
QueryInterface:
function
(iid) {
08
if
(iid.equals(Components.interfaces.nsIAuthPrompt) ||
09
iid.equals(Components.interfaces.nsISupports))
11
throw
Components.results.NS_ERROR_NO_INTERFACE;
15
prompt:
function
(dialogTitle, text, passwordRealm, savePassword, defaultText, result) {
16
result.value = hardCodedPassword;
19
promptPassword:
function
(dialogTitle, text, passwordRealm, savePassword, pwd) {
20
pwd.value = hardCodedPassword;
23
promptUsernameAndPassword:
function
(dialogTitle, text, passwordRealm, savePassword, user, pwd) {
24
user.value = hardCodedUserName;
25
pwd.value = hardCodedPassword;
29
persist.saveURI(urlToFile,
null
,
null
,
null
,
""
, nsFileInstance);
The above is going to give you errors about missing nsIDownloadProgressListener
methods, so you should implement that as well. For example, with empty dummy methods if you are not interested about the progress.
Instead of using QI like above, you can also implement nsIInterfaceRequestor
and return nsIAuthPrompt
from there, like nsIWebBrowserPersist
.progressListener
documentation suggests.
Downloading Images
Sample function for fetching an image file from a URL.
06
function
GetImageFromURL(url) {
07
var
ioserv = Components.classes[
"@mozilla.org/network/io-service;1"
]
08
.getService(Components.interfaces.nsIIOService);
09
var
channel = ioserv.newChannel(url, 0,
null
);
10
var
stream = channel.open();
12
if
(channel
instanceof
Components.interfaces.nsIHttpChannel && channel.responseStatus != 200) {
16
var
bstream = Components.classes[
"@mozilla.org/binaryinputstream;1"
]
17
.createInstance(Components.interfaces.nsIBinaryInputStream);
18
bstream.setInputStream(stream);
22
while
(size = bstream.available()) {
23
file_data += bstream.readBytes(size);
Download observers
Sample download observer for Firefox 2 Download manager.
04
function
sampleDownload_init(){
06
var
observerService = Components.classes[
"@mozilla.org/observer-service;1"
]
07
.getService(Components.interfaces.nsIObserverService);
08
observerService.addObserver(sampleDownloadObserver,
"dl-start"
,
false
);
09
observerService.addObserver(sampleDownloadObserver,
"dl-done"
,
false
);
10
observerService.addObserver(sampleDownloadObserver,
"dl-cancel"
,
false
);
11
observerService.addObserver(sampleDownloadObserver,
"dl-failed"
,
false
);
13
window.addEventListener(
"unload"
,
function
() {
14
observerService.removeObserver(sampleDownloadObserver,
"dl-start"
);
15
observerService.removeObserver(sampleDownloadObserver,
"dl-done"
);
16
observerService.removeObserver(sampleDownloadObserver,
"dl-cancel"
);
17
observerService.removeObserver(sampleDownloadObserver,
"dl-failed"
);
20
var
sampleDownloadObserver = {
21
observe:
function
(subject, topic, state) {
22
var
oDownload = subject.QueryInterface(Components.interfaces.nsIDownload);
26
oFile = oDownload.targetFile;
28
oFile = oDownload.target;
31
if
(topic ==
"dl-start"
){
32
alert(
'Start download to - '
+oFile.path);
35
if
(topic ==
"dl-cancel"
){
36
alert(
'Canceled download to - '
+oFile.path);
39
else
if
(topic ==
"dl-failed"
){
40
alert(
'Failed download to - '
+oFile.path);
43
else
if
(topic ==
"dl-done"
){
44
alert(
'Done download to - '
+oFile.path);
48
window.addEventListener(
"load"
, sampleDownload_init,
false
);