Utiliser FTP avec LiveCode
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.
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.
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.
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.
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.
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.
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.
Récupérer des fichiers
Il faut préparer la zone de liste LstFolder avec la propriété List behavior.
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.
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.
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
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.
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.