Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2

# API de manipulation FTP

Envoyé par : harobed

Date : 27/09/2004 23:48

Bonjour,

j'aimerai savoir si le framework Mozilla contient des class permettant de manipuler le protocol FTP : upload, download de fichier...

Si oui, où trouver une documentation à ce propos ?

Merci d'avance

# Re: API de manipulation FTP

Envoyé par : laurentj

Date : 05/11/2004 13:20

Dans http://xulplanet.com/references/xpcomref(..), il y a des quelques objets traitant de FTP. Mais je ne sais pas comment on les utilise.

Je crois que de toute façon, tout le protocol n'est pas implémenté. Daniel Glazman l'a amélioré dans NVU. Pose ta question dans la mailing-list, peut-être qu'il y répondra.

# Re: API de manipulation FTP

Envoyé par : eclos

Date : 07/12/2004 18:48

Bonjour,

Voici un petit code pour uploader via FTP.
Attention, il faut que ce soit sous une app chrome (ou un plugin).

uploadFTP.xul:

<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 width="200" height="200"
 style="background-color:rgb(109,134,221);">
 <script>
 function onUpload(){
   var eStatus = document.getElementById("status");
   try{
     eStatus.value="Starting ...";
     upload();
     eStatus.value="Done.";
   }catch(ex){
     eStatus.value="ERROR: "+ex;
     alert(ex);
   }
     
 }
 function upload(){
    
   var targetURI="ftp://user:password@ftpperso.site.net/test.txt";
   
   var IO_SERVICE  = Components.classes["@mozilla.org/network/io-service;1"]
                 .getService(Components.interfaces.nsIIOService);

   var ASCII_FILE_STRINGS = "A Z E R T Y "+ (new Date).toString();

   var LocalFile = new  Components.Constructor("@mozilla.org/file/local;1", "nsILocalFile");
   var BINARY_FILE_OBJECT = new LocalFile();
   BINARY_FILE_OBJECT.initWithPath( "c:\autoexec.bat" ); // hei! windows ...
   
   // create stream listener
   var StreamListener = {
      onStartRequest  : function(request, context) {},
      onStopRequest   : function(request, context, statusCode) { alert('End: '+statusCode); },
      onDataAvailable : function(request, context, inputStream, offset, count) {
      }
   };
   
   // create upload channel
   var UploadURI     = IO_SERVICE.newURI(targetURI, null, null);
   var UploadChannel = IO_SERVICE.newChannelFromURI(UploadURI).QueryInterface(Components.interfaces.nsIUploadChannel);
   
   // upload ascii file
   var aStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream);
   aStream.setData(ASCII_FILE_STRINGS, -1);
   UploadChannel.setUploadStream(aStream, "text/plain", -1);
   UploadChannel.asyncOpen(StreamListener, null);
   
   // upload binary file
   //var bStream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
   //bStream.init(BINARY_FILE_OBJECT, 0x04 | 0x08, 420, false); // 1, 0
   //UploadChannel.setUploadStream(bStream, null, -1);
   //UploadChannel.asyncOpen(StreamListener, null); 
 }
 </script>

 <textbox id="status" width="400" readonly="true" />
<hbox>
	<spacer flex="1"/>
	<button label="Upload" oncommand="onUpload();"/>
</hbox>

</window>

Cet exemple a été testé sou Firefox 1.0 .

# Re: API de manipulation FTP

Envoyé par : skygreg

Date : 13/06/2006 09:10

Merci beaucoup ça fonctionne !!

# Re: API de manipulation FTP

Envoyé par : skygreg

Date : 13/06/2006 14:31

sauf que aucune exception n'est levé si l'upload plante :(

# Re: API de manipulation FTP

Envoyé par : thierry

Date : 02/12/2006 14:32

bonjour,

sauf que aucune exception n'est levé si l'upload plante :(

j'ai remarqué que le "statusCode" de la méthode onStopRequest de l'objet StreamListener renvoyait 0 lorsque tout c'est bien passé, mais peut-être que ce n'est pas aussi simple.

sinon le transfert en binaire ne marche pas si l'on ne crée pas un objet du type nsIBufferedInputStream (ff 1.5).

je propose donc un correctif avec en plus de quoi permettre d'implémenter une barre de progression ;)

...

//upload binary file
var bStream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
bStream.init(BINARY_FILE_OBJECT, 0x04 | 0x08, 420, false);

//formatage du flux binaire
const nsIBufferedInputStream  = Components.interfaces.nsIBufferedInputStream;
var buf = Components.classes['@mozilla.org/network/buffered-input-stream;1'].createInstance(nsIBufferedInputStream);
buf.init(bStream, 4096);

...

//les labels qui informent de la progression

var lProgress=document.getElementById('ev');
var lMax=document.getElementById('max');

lProgress.value="initProgress";
lMax.value="initMax"

//création des objets permettant d'observer la progression de la requête

var pSink = {
   onProgress: function(request, context, progress, progressMax)        {
	 lProgress.value=progress;
	 lMax.value=progressMax;
   },
   onStatus: function(request, context, status, statusArg) {
	 
   },
   QueryInterface: function(iid) {
	 if ( iid.equals( Components.interfaces.nsIProgressEventSink ) ||
	  iid.equals( Components.interfaces.nsISupports ) )
	 return this;
	 Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
	 return null;
   }
};

var requestProgress = {
   eventSink: pSink,
   getInterface: function(iid)  {
	if (iid.equals(Components.interfaces.nsIProgressEventSink))
	  return this.eventSink;
   }
}; 

//envoie du flux
UploadChannel.setUploadStream(buf, null, -1);
UploadChannel.notificationCallbacks=requestProgress;
UploadChannel.asyncOpen(StreamListener, null); 

comme je n'ais pas trouvé trace de la méthode "notificationCallbacks" sur le site, est ce que ça veut dire qu'il y a une méthode plus simple pour suivre la progression d'une requête ?

# Re: API de manipulation FTP

Envoyé par : Ner0lph

Date : 08/02/2007 14:51

Il existe un extension de Firefox qui fait client FTP : c'est FireFTP. Tu peux la trouver sur GeckoZone. En regardant le code, tu dois pouvoir trouver ce que tu cherches.

# Re: API de manipulation FTP

Envoyé par : David Marteau

Date : 08/02/2007 16:40

Non, c'est la bonne méthode pour suivre la progression.

# Re: API de manipulation FTP

Envoyé par : cokinou

Date : 21/02/2007 15:44

Bonjour,

Pour les besoins de mon applis, je dois uploader ou downloader un fichier en ftp.... Ne sachant comment faire, je me suis écris un script à partir du code fourni ci-dessus qui fonctionne très bien (grand merci à vous)..... quand l'upload s'est bien passé.

Malheureusement, quand l'upload n'a pas fonctionné ou que je l'ai annulé, je me retrouve avec des statusCode de la méthode onStopRequest() du genre de 2152398869 (lorsque le serveur me jette car je suis déjà connecté => 421 ). Voulant indiquer la raison de l'échec, j'ai essayé de savoir à quoi ces codes correspondent, j'ai cherché sans succès sur Internet une correspondance entre ces codes et quoi que ce soit....

J'ai regardé dans l'extension FireFtp pour trouver un moyen de récupérer le dernier message du serveur (pour trouver la raison du plantage) mais sans succès, en effet FireFtp n'utilise pas du tout le même système pour communiquer avec le serveur ftp.... Ou alors j'ai pas tout compris à son fonctionnement (ce qui est possible vu que je n'es jeté qu'un coup d'oeil dessus).

Quelqu'un a t'il un moyen, ou une idée pour trouver la raison du plantage ?

Merci d'avance

# Re: API de manipulation FTP

Envoyé par : murlock

Date : 01/03/2007 15:10

Dans l'extension Bookmark Sync and Sort, il y a ce code pour récupérer les erreurs (elles semblent provenir du fichier nsError.h présent dans les sources de Mozilla)

@@function getErrorMsg(aStatus) {
   if(aStatus==0)
     return  "ok";

   status=aStatus % 0x804b0000;
   var error="unexpected";
   switch(status)
   {
     case 1:
       error="unexpected";
       break;
     case 2:
       error="usercancel";
       break;
     case 13:
       error="refused";
       break;
     case 14:
       error="netTimeout";
       break;
     case 16:
       error="netOffline";
       break;
     case 21:
       error="loginfailure"
       break;
     case 22:
       error="ftpcwd"
       break;
     case 23:
       error="ftppasv"
       break;
     case 24:
       error="ftppwd"
       break;
     case 25:
       error="ftplist"
       break;
     case 30:
       error="unknown"
       break;
     case 201:
       error="created"
       break;
     case 401:
       error="loginfailure"
       break;
     case 405:
       error="methodNotAllowed"
       break;
     default:
       error="unexpected";
       break;
   }
   var formatted= (aStatus<0x804b0000)?
           aStatus.toString(10) : "0x" + aStatus.toString(16).toUpperCase();
   return formatted + ": " + error + "\n";
}@@

Michael

Aller à la page :  1 2

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.