Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Utilisation du client FTP présent dans MercatorTunnel.dll

0000002259     -      24/06/2016

MercatorTunnel contient un client FTP qui peut être utilisé dans toute programmation C# effectuée dans Mercator Aruba ou Majuro. Le client se trouve dans la classe MercatorFtp.Ftp.

Cette classe contient ces méthodes :

  • Connect : se connecter au serveur FTP
  • GetFile : downloader un fichier depuis le serveur FTP
  • PutFile : uploader un fichier vers le serveur FTP
  • DeleteFile : suppression d'un fichier sur le serveur FTP
  • GetFileList : obtenir le nom des fichiers disponibles dans un répertoire du serveur FTP
  • PutFileAsync : uploader un fichier vers le serveur FTP de façon asynchrone, çàd dans une thread séparé

Ces méthodes (sauf PutFileAsync) sont illustrées dans le code suivant :

Zoom
using (MercatorFtp.Ftp ftp = new MercatorFtp.Ftp("ftp.host.com", "login", "password"))
{
    if (!ftp.Connect())
        Api.Stop(ftp.LastError);


    List<string> l = ftp.GetFileList("dir");

    if (!ftp.GetFile(@"dir\test.zip", @"c:\test\test.zip"))
        Api.Stop(ftp.LastError);

    if (!ftp.DeleteFile(@"dir\test.zip"))
        Api.Stop(ftp.LastError);

    if (!ftp.PutFile(@"c:\test\test.zip", @"dir\test.zip"))
        Api.Stop(ftp.LastError);

    ftp.Disconnect(); // ligne non nécessaire car ftp est instancié dans un bloc using
}

 

Les méthodes GetFile, PutFile et DeleteFile peuvent fonctionner avec des fichiers (locaux) stockés dans la base de données SQL.

Pour effectuer une connexion en mode passif, il suffit de passer au constructeur de Ftp un paramètre supplémentaire à true : MercatorFtp.Ftp ftp = new MercatorFtp.Ftp("ftp.host.com", "login", "password", True);

 


 

 

La méthode PutFileAsync permet l'envoi d'un fichier dans un thread séparé du thread de base de l'application. Cela permet :

  • d'envoyer des fichiers de taille plus conséquente
  • de ne pas bloquer le thread de base et ainsi éviter le message "Mercator is not responding"
  • d'afficher un progressBar et/ou un message de la forme "10 Mb / 100 Mb"

Cette méthode renvoie un boolean. La valeur true n'indique toutefois pas que le transfert est terminé mais simplement que le transfert à pu être correctement initialisé. C'est l'évènement ftpProgressCompleted qui permettra de savoir si le transfert s'est terminé avec ou sans erreur.

Pour ce transfert asynchrone, Mercator utilise la classe FtpAsyncUploader qui surclasse un BackgroundWorker du framework .net. Cela permet de disposer de toutes les fonctionnalités du BackgroundWorker. (Par exemple, la possibilité d'annuler la tâche exécutée en arrière plan).

Le code ci-dessous montre une implémentation complète de cet upload asynchrone. Il utilise notammement ces contrôles, à prévoir le cas échéant (les propriétés à changer sur ces contrôles sont reprises entre parenthèses) :

  • labelProgress : label indiquant la progression du transfert sous la forme "10 Mb / 100 Mb"
  • progressBar14 : progressBar montrant la progression du transfert en % (Visible = false; Minimum = 0; Maximum = 100)
  • buttonCancelUpload : bouton permettant d'interrompre l'upload (Enabled = false)
Zoom
private void startFtp()
 {
     Api.WaitWindow("Connexion au serveur FTP en cours...");
     ftp = new MercatorFtp.Ftp("ftp.host.com", "login", "password");
     if (!ftp.Connect())
     {
         Api.Stop(ftp.LastError);
         ftp.Dispose();
         ftp = null;
         Api.WaitClear();
         return;
     }

     Api.WaitWindow("Upload FTP en cours...");
     if (!ftp.PutFileAsync(targetDir + _dr_dest["d_newid"].ToString() + ".zip", @"_pub\wwwroot_www.mercator.eu\dealerzone\masters\" + _dr_dest["d_newid"].ToString() + ".zip", ftpProgressChanged, ftpProgressCompleted, out ftpAsyncUploader))
     {
         Api.Stop(ftp.LastError);
         ftp.Dispose();
         ftp = null;
         Api.WaitClear();
         return;
     }
     Cursor = System.Windows.Forms.Cursors.WaitCursor;
     progressBar14.Value = 0;
     progressBar14.Visible = true;
     buttonCancelUpload.Enabled = true;
 }

 private void ftpProgressChanged(object sender, ProgressChangedEventArgs e)
 {
     labelProgress.Text = e.UserState.ToString();
     progressBar14.Value = e.ProgressPercentage;
 }

 void ftpProgressCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
     buttonCancelUpload.Enabled = false;
     Cursor = System.Windows.Forms.Cursors.Default;
     Api.WaitClear();
     progressBar14.Visible = false;
     if (string.IsNullOrEmpty(ftp.LastError))
     {
         done14 = true;
         ici continuer le code : le transfert a été effectué sans erreur
     }
     else
     {
         Api.Stop(ftp.LastError);
     }
     ftp.Dispose();
     ftp = null;
     ftpAsyncUploader.Dispose();
     ftpAsyncUploader = null;
 }


 private void buttonCancelUpload_Click(object sender, EventArgs e)
 {
     if (ftpAsyncUploader != null)
     {
         ftpAsyncUploader.CancelAsync();
         buttonCancelUpload.Enabled = false;
         labelProgress.Text = "FTP upload canceled !";
     }
 }