Pour télécharger des fichiers depuis une application XUL, il existe plusieurs méthodes. Ici, nous allons simplement décrire une méthode simple utlisant le gestionnaire de téléchargement intégré à votre navigateur (Celui du menu Outils > Téléchargements).
Voici une fonction appelant les interfaces XPCOM nécessaires à cette opération :
function dl(url_fic, dest) {
var dlmgr = Components.classes['@mozilla.org/download-manager;1']
.getService(Components.interfaces.nsIDownloadManager);
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var s_uri = ioService.newURI(url_fic, null, null);
var t_uri = ioService.newURI(dest, null, null);
const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
var persist = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
.createInstance(Components.interfaces.nsIWebBrowserPersist);
var flags = nsIWBP.PERSIST_FLAGS_NO_CONVERSION |
nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;
persist.persistFlags = flags;
var ret = dlmgr.addDownload ( -1, s_uri, t_uri, 'test', null, null, -1, null, persist);
persist.progressListener = ret;
persist.saveURI(s_uri, null, null, null, null, t_uri);
}
Le téléchargement de fichier s'effectue ici de manière asynchrone; c'est-à-dire que le fichier commence à s'enregistrer à l'emplacement souhaité mais sans bloquer le script. C'est un point important à comprendre. Lorsque la fonction aura terminée son traitement, le fichier ne sera pas encore disponible !
Trois interfaces XPCOM sont nécessaires ici : # Une pour accéder au gestionnaire de téléchargement : Components.classes['@mozilla.org/download-manager;1'].getService(Components.interfaces.nsIDownloadManager); # Une pour définir les URIs du fichier à charger ainsi que du nom et emplacement pour son enregistrement : Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); # Une pour "animer" la progression de l'enregistrement : var persist = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Components.interfaces.nsIWebBrowserPersist);
Vous noterez que c'est cette dernière interface qui est indispensable pour le téléchargement. Elle contient la fonction utile saveURI() qui est assez simple à comprendre.
Ici, le nom du fichier à enregistrer peut être différent de son nom d'origine. C'est simplement pour les besoins de cette fonction. Par exemple pour enregistrer le tutoriel pdf sur votre ordinateur en le renommant :
Sous Linux :
dl('[[http://download.berlios.de/xulfr/TutorielXUL-28082005.pdf']], '/home/user/document/tutoriel.pdf');
Sous Windows :
dl('[[http://download.berlios.de/xulfr/TutorielXUL-28082005.pdf']], '[[file://C]]:\tutoriel.pdf');
Simple, il suffit d'ajouter un dlmgr.open(window._content, t_uri.path); dans votre script, et il s'affichera de la même manière que par le menu. Vous visualiserez ainsi en direct le téléchargement.
On peut aussi utiliser la commande suivante :
window.openDialog("[[chrome://mozapps/content/downloads/downloads.xul"]], "ext", "chrome,dialog,centerscreen,resizable");
Le script est volontairement simpliste. Il y a a beaucoup d'arguments à null ou -1. Il faut vous rendre sur la documentation des interfaces pour une meilleure compréhension de leur emploi. Voir http://xulplanet.com/references/xpcomref(..)
On peut aussi utiliser l'élément browser en le cachant :
<browser id='my-browser' style='visibility: hidden'/>
On peut ensuite charger un fichier de la manière suivante :
var browser = document.getElementById('my-browser');
browser.loadURI(url, null, null);
Cela peut cependant poser un problème si le fichier à télécharger est reconnu comme "affichable" par Gecko (HTML, images, etc). Dans ce cas, si on contrôle le serveur, on peut utiliser les headers HTTP Content-Disposition et Content-Type, ce qui obligera l'élément browser à proposer le téléchargement.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.