U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Gebruik van de FTP-client die aanwezig is in MercatorTunnel.dll

0000002259     -      24-06-2016

MercatorTunnel bevat een FTP-client die gebruikt kan worden in alle C#-programmaties die uitgevoerd worden in Mercator Aruba of Majuro. De client bevind zich in de klasse MercatorFtp.Ftp.

Deze klasse bevat volgende methods:

  • Connect: om te connecteren naar de FTP-server
  • GetFile: download een bestand via de FTP-server
  • PutFile: upload een bestand via de FTP-server
  • DeleteFile: een bestand verwijderen vanop de FTP-server
  • GetFileList: ontvangen van de beschikbare bestandsnamen in een directory op de FTP-server
  • PutFileAsync: upload een bestand asynchroon naar de FTP-server, dit wil zeggen via een aparte thread.

Deze methods (zonder PutFileAsync) worden aangehaald in de volgende code:

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(); // lijn niet noodzakelijk want FTPP is geïnitialiseerd in het using-blok
}

 

De methods GetFile, PutFile en DeleteFile kunnen werken met (lokale) bestanden opgeslagen in de SQL-gegevensdatabank.

Om een connectie uit te voeren in passif-mode, volstaat het om een extra parameter mee te geven in de FTP-constructor die de waarde true bevat: MercatorFtp.Ftp ftp = new MercatorFtp.Ftp("ftp.host.com", "login", "password", True);

 


 

 

De method PutFileAsync laat ons toe om een bestand te verzenden in een thread die gescheiden is van de thread waar de applicatie op draait. Dit laat ons toe om:

  • grotere bestanden te versturen
  • de base thread niet te overbelasten zodat we "Mercator reageert niet"-meldingen kunnen vermijden
  • een progressbar weer te geven met een bericht in de vorm van "10 Mb / 100 Mb"

Deze method ontvangt een bool. De waarde true wil niet zeggen dat de transfer voltooid is, maar dat de transfer goed geïnitialiseerd werd. Het is het event ftpProgressCompleted die ons laat weten of de transfer geslaagd is zonder foutmelding.

Voor de asynchrone transfer, gebruikt Mercator de klasse FtpAsyncUploader die zich inschrijft op de klasse BackgroundWorker van het .NET-framework. Dit laat ons toe om te beschikken over alle functionaliteiten van de BackgroundWorker. (bijvoorbeeld, de mogelijkheid om de taak die op de achtergrond uitgevoerd wordt te annuleren).

De code hieronder toont een volledige implementatie van de asynchrone upload. HEt gebruikt verschillende controles om juist te zijn ( de te veranderen properties voor deze controles zijn vermeld tussen haakjes)

  • labelProgress: label dat de overdracht-progress weergeeft onder de vorm van "10 Mb / 100 Mb"
  • progressBar14: progressBar toont de vooruitgang van de overdracht in procenten (Visible = false; Minimum = 0; Maximum = 100)
  • buttonCancelUpload: knop die ons toelaat om de overdracht te onderbreken (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 !";
     }
 }