Vous êtes ici:

Menu

Utiliser FTP avec LiveCode

Stacks Image 3739
Voici un petit tuto sur un client FTP avec LiveCode. Je ne ferais pas un cours magistral sur le protocole FTP, d'autre le font mieux que moi. Au cours de mes investigations, ce tuto va s'enrichir au fur et à mesure de nouvelles fonctionnalités pour vous présenter un client FTP relativement complet.
Pour ma maquette, j'utilise un serveur FTP Filezilla installé par défaut sous une VM Windows. L'intérêt de cette maquette est sa simplicité, de plus j'utilise WireShark pour vérifier le bon fonctionnement des processus FTP.

Création de l'interface

L'interface est très simple, vous trouverez sur l'image les principaux objets que nous allons utiliser. Pour les boutons, j'utilise sans modération la propriété label.
Stacks Image 3746
Création de l'interface

Le code de l'interface

Connexion au serveur FTP

Nous commencerons par le bouton Browse. Nous validerons la saisie des champs hosts, user et password. Puis on exécutera la procédure OpenFtp située dans l'Handler de la carte.

on mouseUp
   if fld "txtHost" <> "" then
      if fld "txtUser" <> "" then
         if fld "txtPassword" <> "" then
            OpenFtp fld "txtHost", fld "txtUser", fld "txtPassword"
         else
            answer warning "Pas de Password !" titled "Erreur"
         end if
      else
         answer warning "Pas de User !" titled "Erreur"
      end if
   else
      answer warning "Pas de Host !" titled "Erreur"
   end if
end
mouseUp

Voici la procédure OpenFtp, elle récupère les informations de connexion FTP et les stocke dans des variables communes aux procédures stockées dans l'handler de la carte.

local sFTPHost, sFTPUser, sFTPPassword

on OpenFtp pFTPHost, pFTPUser, pFTPPassword
   local tUrl

   put pFTPHost into sFTPHost
   put pFTPUser into sFTPUser
   put pFTPPassword into sFTPPassword

   put URL ("ftp://" & sFTPUser & ":" & sFTPPassword & "@" & sFTPHost & "/") into tUrl

   put tUrl into field "lstFolder"

end OpenFtp

La fonction put URL va effectuer un "browse" du serveur FTP. Comme nous n'avons pas encore uploader de fichier, nous n'aurons aucun retour dans la zone de liste. Avec WireShark, nous pouvons vérifier le bon fonctionnement de notre application.
Stacks Image 3760
Capture séquence FTP

récupération des logs FTP

Afin d'améliorer le contrôle du bon fonctionnement de l'application, nous pouvons activer la génération de log. C'est ce que nous allons faire avec le code du bouton btnLog.

on mouseUp
   if the label of me = "enable log" then
      libUrlSetLogField "field lstLog"
      set the label of me to "disable log"
   else
      libUrlSetLogField empty
      set the label of me to "enable log"
   end if
end
mouseUp

La fonction libUrlSetLogField initialise l'affichage des logs dans la zone de liste lstLog. Pour annuler cette fonctionnalité, il suffira de rappeler cette fonction en ajoutant empty.
Stacks Image 3767
Affichage des logs

Envoyer des fichiers

Pour envoyer des fichiers sur notre serveur FTP, on utilisera la fonction libURLftpUploadFile. Préparons le script du bouton Upload.

on mouseUp
   local tFileForUpload, tFileName

   -- on affiche la boite de dialogue pour séléctionner un fichier
   answer file "Selectionner un fichier pour envoi sur le serveur FTP"
   -- on récupère le chemin et le nom du fichier
   put it into tFileForUpload

   -- on récupère le nom du fichier
   set the itemdel to "/"
   put the last item of tFileForUpload into tFileName

   -- on utilise une procédure pour envoyer notre fichier
   -- attention dans cette version il n'y pas de contrôle
   -- assurez-vous que vous avez initialisez les variables
   -- de connexion avec le bouton browse
   uploadFTP tFileForUpload, tFileName

end mouseUp

La fonction de ce script est de sélectionner un fichier et d'utiliser la procédure uploadFTP située dans l'Handler de la carte.

on uploadFTP pFileForUpload, pFileName
local tDestination

   put "ftp://" & sFTPUser & ":" & sFTPPassword & "@" & sFTPHost & "/" & pFileName into tDestination
   libURLftpUploadFile pFileForUpload, tDestination, "uploadComplete"

end uploadFTP

La fonction libURLftpUploadFile envoie le fichier sélectionné dans le serveur FTP. Il sera intéressant d'améliorer notre programme pour rafraîchir la liste des fichiers de notre serveur FTP et réaliser quelques contrôles de fonctionnement. Tout, vérifions si notre fichier est bien arrivé à destination. Si vous aviez activé les logs, vous avez du voir les messages associés au transfert du fichier.
Stacks Image 3774
Transfert d'un fichier et vérification en cliquant sur le bouton Browse.

Récupérer des fichiers

Il faut préparer la zone de liste LstFolder avec la propriété List behavior.
Stacks Image 3781
Transfert d'un fichier et vérification en cliquant sur le bouton Browse.
Le résultat de la zone de liste ne nous permet pas de récupérer facilement le nom du fichier. Le résultat est au format UNIX identique à la commande ls, le résultat affiche les droits des fichiers sur le serveur ftp, le nom et groupe du propriétaire de chaque fichier, la date et heure de création du fichier et enfin le nom du fichier. On peut utiliser aussi la commande ftp NLST pour afficher seulement les noms de fichiers. Pour cela, saisir le script associé au bouton btnList

on mouseUp
   if the label of me = "LIST" then
      libURLSetFTPListCommand "NLST"
      set the label of me to "NSLT"
   else
      libURLSetFTPListCommand "LIST"
      set the label of me to "LIST"
   end if
   put empty into field "LstFolder"
end mouseUp

En switchant avec ce bouton, nous pouvons visualiser seulement les noms de fichier.
Stacks Image 3786
Lister les fichiers avec NLST
Construisons le script du bouton download, il faudra détecter le mode LIST ou NSLT du serveur FTP.

on mouseUp
   local tFileName, tSelected

   if the selectedtext of fld "LstFolder" <> "" then
      if the label of button "BtnList" = "LIST" then
         put the selectedtext of fld "LstFolder" into tSelected
         put char 50 to length(tSelected) of tSelected into tFileName
      else
         put the selectedtext of fld "LstFolder" into tFileName
      end if
      downloadFtp tFileName
   end if
end
mouseUp

La fonction de ce script est de récupérer un fichier sélectionné dans la zone de liste LstFolder et d'utiliser la procédure downloadFtp située dans l'Handler de la carte.

on downloadFtp pFileForDownload
   local tFileForDownload

   put "ftp://" & sFTPUser & ":" & sFTPPassword & "@" & sFTPHost & "/" & pFileForDownload into tFileForDownload
   answer folder "choisissez un dossier"
   libURLDownloadToFile tFileForDownload,it & "/" & pFileForDownload,"loadDone"

end downloadFtp

La fonction libURLDownloadToFile permet d'initialiser un procédure loadDone; Celle-ci va vérifier le bon déroulement de l'opération.

on loadDone pUrl, pStatus
   if pStatus is "error" then
      answer "Download failed"
   end if
   unload url pUrl
end loadDone

Utilisation d'une barre de progression

Dans ce dernier chapitre, nous verrons l'utilisation d'une barre de progression pour afficher la progression des downloads et uploads. Pour initialiser la procédure contrôlant l'activité du serveur FTP, nous utiliserons une fonction libURLSetStatusCallback. Modifions pour cela les procédures uploadFTP et downloadFtp.

on uploadFTP pFileForUpload, pFileName
   local tDestination

   put "ftp://" & sFTPUser & ":" & sFTPPassword & "@" & sFTPHost & "/" & pFileName into tDestination

   libURLSetStatusCallback "loadProgress", the long ID of me

   libURLftpUploadFile pFileForUpload, tDestination, "loadComplete"

end uploadFTP

on downloadFtp pFileForDownload
   local tFileForDownload

   put "ftp://" & sFTPUser & ":" & sFTPPassword & "@" & sFTPHost & "/" & pFileForDownload into tFileForDownload
   answer folder "choisissez un dossier"

   if it <> "" then
      libURLSetStatusCallback "loadProgress", the long ID of me

      libURLDownloadToFile tFileForDownload,it & "/" & pFileForDownload,"loadComplete"
   end if

end downloadFtp

Créons la procédure loadProgress

on loadProgress pURL, pStatus
   local tItem

   put item 1 of pStatus into tItem
   if tItem = "uploading" or tItem = "loading" then
      set the endValue of scrollbar "ProgressFTP" to item 3 of pStatus
      set the thumbPosition of scrollbar "ProgressFTP" to item 2 of pStatus
   end if
end
loadProgress

Cette procédure vérifie le déroulement du processus FTP, nous détectons les événements uploading et loading et nous récupérons les valeurs de données téléchargées (item 2) ou uploadées ainsi que la valeur de la taille du fichier (item 3). Enfin, nous modifions la dernière procédure loadDone

on loadComplete pURL, pStatus
   if pStatus is "error" then
      answer "Download failed"
   else
      answer "Transfert complet"
   end if
   unload url pUrl
end loadComplete

Il nous reste à finaliser le bouton btnClear qui effacera toutes les zones de liste.

on mouseUp
   put empty into field "lstError"
   put empty into field "lstLog"
   put empty into field "lstFolder"
end mouseUp

Cet article est terminé, notre programme peut être encore amélioré mais le but était de voir les principales fonctions pour la gestion du FTP.
comments powered by Disqus
 Vous êtes ici: