Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Kommunikation und Netzwerk

k24:k24.2:k24.2.3.2:start

24.2.3.2 Projekt 2 – FTP-Client

Das zweite Projekt, das die Verwendung der Klasse FTPClient demonstriert, ist speziell für folgenden Einsatz konzipiert worden: Die existierenden Kapitel des Gambas-Online-Buches werden von Emily Görnandt zuerst in die englische Sprache übersetzt, dann redigiert und abschließend in die englische Version unseres Buches unter https://gambas-buch.de/dwen eingefügt. Für den Upload der einzelnen, übersetzten Seiten im DokuWiki-Format nutzt sie das Projekt 2 'DW_UPLOAD'. Die Grundstruktur des Projektes 2 wird aus dem Projekt 1 übernommen und insbesondere für den Datei-Upload angepasst.

Der Dialog zur Festlegung der FTP-Verbindungsdaten erfasst nur den FTP-Benutzernamen und dessen FTP-Passwort:

BILD 1

Abbildung 24.2.3.2.1: Dialog 1 – FTP-Verbindungsdaten

Beachten Sie: Der englische Text für ein Kapitel trägt im Dateinamen stets den Suffix '_en'.

BILD 2

Abbildung 24.2.3.2.2: Dialog 2 – Auswahl eines übersetzten Kapitels im DokuWiki-Format

Während der lokale Pfad zur Upload-Datei durch den Datei-Auswahl-Dialog 2 festgelegt wird, wird der Server-Pfad – zusammen mit der im Programm hinterlegten URL des FTP-Servers – aus dem lokalen Pfad zur Upload-Datei generiert. Eine spezielle Routine konvertiert u.a. den Dateinamen der Upload-Datei in 'start.txt', weil in DokuWiki alle Seiten diesen Datei-Namen tragen! Die Zuordnung zum Kapitel realisiert der so genannte 'Namespace' – hier k24.2.3:

BILD 3

Abbildung 24.2.3.2.3: Das Hochladen der Datei kann gestartet werden …

24.2.3.2.1 Quelltext Dialog 1 – FTP-Verbindungsdaten

Der Dialog zum Einlesen der FTP-Verbindungsdaten ist erfreulich kurz:

' Gambas class file
 
Private cFTPAccountData As Collection
Private hFTPClient As New FtpClient
 
Public Sub _call(sTitel As String) As Collection
 
    Me.Text = sTitel
 
'-- Returns if one of the two buttons was clicked! The return value is set/specified in the
'-- Me.Close() call and indicates whether the dialog was aborted or not.
 
    If Me.ShowModal() = 0 Then
       Return Null
    Else
       If txbFTPUserName.Text And If txbFTPUserPassword.Text Then
          cFTPAccountData = New Collection
          cFTPAccountData["FTPUsername"] = txbFTPUserName.Text
          cFTPAccountData["FTPPassword"] = txbFTPUserPassword.Text
          Return cFTPAccountData
       Else
          Message.Error(("The FTP account data are not complete!"))
          txbFTPUserName.SetFocus()
          Return
       Endif
    Endif
 
End
 
Public Sub Form_Open()
 
'-- Is an active network accessible?
    MAdditional.CheckNetwork()
 
    txbFTPUserName.Text = MSettings.AppSettings["FTP/Username"]
    txbFTPUserPassword.Text = MSettings.AppSettings["FTP/Password"]
 
End
 
Public Sub bConnect_Click()
    If txbFTPUserName.Text And If txbFTPUserPassword.Text Then
       Me.Close(1)
    Endif
End
 
Public Sub bCancel_Click()
    Me.Close(0)
End
 
Public Sub Form_Close()
 
    hFTPClient.Close()
 
    If rbtnRemember.Value = True Then
       MSettings.AppSettings["FTP/Username"] = txbFTPUserName.Text
       MSettings.AppSettings["FTP/Password"] = txbFTPUserPassword.Text
    Else
       MSettings.AppSettings["FTP/Username"] = ""
       MSettings.AppSettings["FTP/Password"] = ""
    Endif
 
    MSettings.AppSettings.Save()
 
End

24.2.3.2.2 Quelltext Programm – DW_UPLOAD

Der Programm-Quelltext wird komplett angegeben und ist hinreichend kommentiert. Im Gegensatz zum Projekt 1 werden alle relevanten Ereignisse der Klasse FTPClient eingesetzt. Das komplette Projekt-Archiv finden Sie im Downloadbereich.

' Gambas class file
 
' ● Unverschlüsseltes FTP ist unsicher. Bitte wechseln Sie zu FTP über TLS oder zu SFTP.
' ● Unencrypted FTP is insecure. Please switch to FTP over TLS or to SFTP.
 
Public bConnected As Boolean
Public hFTPClient As FtpClient
Private cFTPAccountData As Collection
 
Public Sub _new()
 
    MDir.CreateBasicDirectory()
    If MDir.BasicDir Begins "/tmp" Then
       MAdditional.SetNotification("dialog-information", ("Attention"), ("The base directory is a \
                                    temporary directory!"))
    Endif
 
'-- OPTION: Folder for configuration files .../config and configuration file *.conf
    MSettings.CreateAppSettings()
 
'-- OPTION: Folder for sound files
'-- Sound files need an absolute path!
'-- Example: MAdditional.PlaySound(MDir.SoundsDir &/ "start.ogg")
    MDir.CreateSoundsDirectory()
 
End
 
Public Sub Form_Open()
 
    Dim FDLogin As New FDLogin
 
    MAdditional.CheckNetwork()
    MSettings.RestoreFormPosition(FMain)
 
    FMain.Icon = Picture["./icons/project_icon.png"]
    FMain.Caption = Upper(Application.Name) & " - VERSION: " & MSettings.AppSettings["Version/Number"]
 
    hFTPClient = New FtpClient As "hFTPClient"
 
 
    cFTPAccountData = FDLogin(("FTP Access Data"))
 
    If Not cFTPAccountData Then
'-- The main program is terminated without comment!
       FMain.Close()
    Else
       MAdditional.PlaySound(MDir.SoundsDir &/ "login.wav")
 
       hFTPClient.User = cFTPAccountData["FTPUsername"]
       hFTPClient.Password = cFTPAccountData["FTPPassword"]
 
   '-- OPTION
       hFTPClient.Debug = True
 
    Endif
 
End
 
Public Sub btnSelectUploadFile_Click()
 
    Dim i As Integer
    Dim sPartPath As String
    Dim sFileName, sServerURL, sServerChapterPath, sServerFileName As String
    Dim aParts As String[]
 
    txaEnglishText.Clear()
 
    Dialog.Title = ("Select a (English) DokuWiki file ...")
    Dialog.Filter = ["*.txt", "Text Files"]
 
'-- Select exactly 1 file (False -> Multiselect switched off)
    If Dialog.OpenFile(False) Then Return
 
    txbSourcePath.Text = Dialog.Path
 
'-- The original text is inserted into the TextArea (txaOriginal)
    txaEnglishText.Text = File.Load(Dialog.Path)
    txaEnglishText.SetFocus()
    txaEnglishText.Pos = 0
 
'---------------------------------------------------------------------------------------------------------
    txbSourcePath.Text = Dialog.Path
    FMain.Caption = Subst("&1  -  &2:  &3", Upper(Application.Name), ("Name of the file to upload"),
                    File.Name(Dialog.Path))
'---------------------------------------------------------------------------------------------------------
 
    aParts = Split(File.Dir(Dialog.Path), "/")
    For i = 0 To aParts.Max
      If aParts[i] Begins "k" Then sPartPath = sPartPath & "/" & aParts[i]
    Next
 
    sFileName = File.BaseName(Dialog.Path)
 
    If sFileName Ends "_en" Then sFileName = Replace(sFileName, "_en", "")
    sServerURL = "gambas-buch.de/web/dokuwiki/dwen/data/pages"
 
    sServerChapterPath = sPartPath
    sServerFileName = sFileName & ".txt"
    txbTargetURL.Text = sServerURL &/ sServerChapterPath &/ sServerFileName
 
'----------------------------------
    Prepare(txaEnglishText.Text)
'----------------------------------
 
    btnSelectUploadFile.Picture = Picture["leds/led_green_16x16.png"]
    btnFileUpLoad.Enabled = True
 
End
 
Public Sub btnFileUpLoad_Click()
 
    Dim bFTPClientStatus As Boolean = False
 
    If txbSourcePath.Text <> "" And If txbTargetURL.Text <> "" Then
    '-----------------
       FileUpload()
    '-----------------
 
       Repeat
         Wait 0.001
         lblFTPStatus.Text = "FTP-Status = " & hFTPClient.Status
       Until bFTPClientStatus = bConnected
 
    Endif
 
End
 
Public Sub hFTPClient_Connect()
    lblFTPStatus.Text = "FTP status: Connection to FTP server established!"
    bConnected = True
End
 
Public Sub hFTPClient_Finished()
    ProgressBar1.Value = 1
    btnFileUpLoad.Picture = Picture["leds/led_green_16x16.png"]
    lblFTPStatus.Text = "FTP status: Transfer complete"
    If bConnected = True Then hFTPClient.Close()
End
 
Public Sub hFTPClient_Progress()
'-- (Relative) Display of the uploaded bytes in relation to the size of the transferred file.
    If hFTPClient.TotalUploaded > 0 Then
       ProgressBar1.Value = hFTPClient.Uploaded / hFTPclient.TotalUploaded
    Endif
End
 
Public Sub hFTPClient_Error()
  Message.Error("<b><font color='DarkRed'>FTP: ERROR</b></font><hr>" & hFTPClient.ErrorText)
End
 
Public Sub hFTPClient_Read()
  Print "READ = "; hFTPClient.ReadLine
End
 
Public Sub btnClose_Click()
    FMain.Close()
End
 
Private Sub Prepare(sEnglishText As String)
 
    Dim iLineCounter, i As Integer
    Dim aLines As String[]
 
'-- Split DokuWiki source code passed as a parameter into single lines that are stored in a string array
    aLines = Split(sEnglishText, gb.NewLine)
 
'-- Remove multiple blank lines in the original source text
    For iLineCounter = aLines.Max To 1 Step -1
      If aLines[iLineCounter] = aLines[iLineCounter - 1] And IsNull(aLines[iLineCounter]) Then
         aLines.Remove(iLineCounter)
      Endif
    Next
    txaEnglishText.Clear()
 
'-- Display the English DokuWiki text in the TextArea 'txaEnglishText'
    For i = 0 To aLines.Max
      txaEnglishText.Insert(aLines[i] & gb.NewLine)
    Next
 
End
 
Private Sub FileUpload()
    hFTPClient.URL = txbTargetURL.Text
'-- The Argument in the Put(sArg) method is the path of the file to be uploaded *on the local PC*
'-- Upload the selected DokuWiki source text file:
    hFTPClient.Put(txbSourcePath.Text)
End
 
Public Sub Form_Close()
 
    MAdditional.PlaySound(MDir.SoundsDir &/ "logout.wav")
 
    MSettings.StoreFormPosition(FMain)
    If MSettings.AppSettings["Version/Number"] <> Application.Version Then
       MSettings.AppSettings["Version/Number"] = Application.Version
       MSettings.AppSettings.Save()
    Endif
 
End

Download

Projekt

Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k24/k24.2/k24.2.3.2/start.txt · Zuletzt geändert: 01.04.2022 (Externe Bearbeitung)

Seiten-Werkzeuge