Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Telechargement asynchrone

Télécharger un fichier

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

Explications

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

Et pour afficher le gestionnaire de téléchargement ?

Première méthode

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.

Deuxième méthode

On peut aussi utiliser la commande suivante :

 window.openDialog("[[chrome://mozapps/content/downloads/downloads.xul"]], "ext", "chrome,dialog,centerscreen,resizable");

Nota bene

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(..)

Autre possibilité

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.