Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [Résolu] Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Raphael

Date : 23/04/2007 16:20

Bonjour, j'essaie actuellement de télécharger un fichier depuis un serveur.

Je me suis complètement inspiré du tutorial Téléchargement asynchrone du Wiki.

Voici ma fonction de téléchargement :

function dl(url_fic, dest)
{
try{
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);
} catch(e) {alert(e)}
}

Et ça me renvoie l'erreur :

[Exception..."Component returned failure code: 0x804b000a nsIIOService.newURI "
nsresult: "0x804b000a(<unknown>)" location: "JS Frame:: chrome://ydm/content/libs/updatemanager.js::dl::line 103" data:no]

J'utilise XR 1.9a3 sous Ubuntu Edgy Eft.

Je débute vraiment dans ce domaine-là... mon but est juste de télécharger un fichier dont je connais l'adresse, et une fois fait, je le décompresse (ça, pas de problème, j'y arrive maintenant) mais je dois donc savoir quand le téléchargement est fini : A priori, soit je dois faire un DL synchrone, soit asynchrone mais en apprenant comment faire pour observer la fin du téléchargement.

Est-ce que quelqu'un pourrait m'aider sur ce problème épineux ? Merci d'avance.

# Re: Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Raphael

Date : 25/04/2007 21:22

Bon, alors chose très bizarre, le script semble planter sur la 2° ligne :

var s_uri = ioService.newURI(url_fic, null, null);
var t_uri = ioService.newURI(dest, null, null);

Je me suis dit que newURI ne marchait peut-être plus pour des adresses locales, alors j'ai essayé avec newFileURI à partir d'un nsIFile au cas où...

var s_uri = ioService.newURI(url_fic, null, null);
var t_uri = ioService.newFileURI(dest);

Et bizarrement, là ça fonctionne... étrange.

Il me reste maintenant un problème : Comment savoir quand les fichiers sont téléchargés pour pouvoir lancer une fonction après... Quelqu'un saurait-il me briefer un peu sur tous ces progressListener et autres choses qui "scrutent" ce qui se passent, car j'ai du mal... Moi, tant qu'un script s'écoule de façon linéaire, je comprends à peu près, mais en passant en asynchrone, wouh... je maitrise pas trop.

Merci.

# Re: Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : chBok

Date : 26/04/2007 07:32

Raphael a écrit:

Il me reste maintenant un problème : Comment
savoir quand les fichiers sont téléchargés pour
pouvoir lancer une fonction après... Quelqu'un
saurait-il me briefer un peu sur tous ces
progressListener et autres choses qui "scrutent"
ce qui se passent, car j'ai du mal... Moi, tant
qu'un script s'écoule de façon linéaire, je
comprends à peu près, mais en passant en
asynchrone, wouh... je maitrise pas trop.

Je viens juste de traduire la page MDC sur les observateurs de téléchargement. Ca ne me parait pas trop compliqué à comprendre.

Le principe est d'utiliser la méthode addObserver sur un objet service mozilla.org/observer-service;1

# Re: Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Raphael

Date : 26/04/2007 09:20

Ah c'est toi qui l'a traduite, merci beaucoup je l'avais remarqué y a 3 jours mais j'avais pas remarqué qu'elle était si récente... (à moins que je ne l'ai consulté en EN, c'est possible car c'est toujours un peu plus complet en EN, alors ça devient une habitude).

Merci beaucoup, je m'y atèle de suite !

EDIT : Euh, j'ai quand même du mal à comprendre où inclure tout ça... Apparemment, y a une fonction et une variable ainsi que l'exécution de window.addEventListener("load", sampleDownload_init, false);

Mais où mettre tout ça ? J'ai une boucle qui télécharge une série de fichier en asynchrone par la méthode exposée plus haut... Bon, m'en vais relire le tutoriel du site, surtout les passages sur les listener que j'avais un peu sauté moi XD

EDIT 2 : Ah y est, j'arrive enfin à quelques résultats, ouf... Je vais enfin pouvoir travailler au corps mon code pour faire ce que je veux, je vous tiens au courant.

# Re: [Résolu] Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Utilisateur anonyme

Date : 03/05/2007 20:48

Salut j'ai essayer t'a méthode Raphael mais j'ai un jolie:

Error: uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 [nsIIOService.newFileURI]"  
nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)"  
location: "JS  frame :: chrome://firezilla/content/global.js :: dl :: line 127"  data: no]

# Re: [Résolu] Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Raphael

Date : 03/05/2007 22:06

Ah bon ? Est-ce une erreur qui fait tout planter ou juste un warning ? J'utilise XULrunner 1.9a3 et voici ma fonction de téléchargement asynchrone :

/*************************************************************************************************************/
/*                                   TELECHARGEMENT ASYNCHRONE D'UN FICHIER                                  */
/*************************************************************************************************************/
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.newFileURI(dest);
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);
}

Et ça marche bien pour moi, même si je ne maitrise pas tous les méandres de ce bout de code.

# Re: [Résolu] Télécharger un fichier .zip, tout simplement... mais je n'y parviens pas.

Envoyé par : Kelson

Date : 26/06/2007 20:33

Le type d'erreur que Pitux obtient peut être obtenu entre autre si l'on donne '/tmp/test.txt' au lieu de 'file:///tmp/test.txt' pour le fichier de destination.

Il n'est plus possible de poster des messages dans ce forum.


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.