FTP-Funktionen


Es gibt eine Reihe von FF-Scriptbefehlen zur Datenübertragung nach dem File Transfer Protocol (FTP):
FF_CloseFTP
Schließt die bestehende FTP-Verbindung
FF_CreateFTPDir
Erstellt ein Verzeichnis auf dem FTP-Server
FF_DeleteFTPDir
Löscht ein Verzeichnis auf dem FTP-Server
FF_DeleteFTPFile
Löscht eine Datei vom FTP-Server
FF_ListFTPDirs
Liefert Verzeichnisse im aktuellen Pfad mit CRLF getrennt
FF_FTPCommand
Führt einen FTP-Befehl aus
FF_FTPFileExists
Überprüft, ob die Datei auf dem FTP-Server existiert
FF_GetCurrentFTPDir
Liefert das aktuelle Verzeichnis auf dem FTP-Server
FF_ListFTPFiles
Liefert Dateien im aktuellen Pfad mit CRLF getrennt
FF_OpenFTP
Öffnet eine FTP-Verbindung
FF_ReadFTPFile
Kopiert eine Datei vom FTP-Server auf den lokalen Rechner
FF_RenameFTPFile
Benennt eine Datei auf dem FTP-Server um
FF_SaveFTP
Lädt ein Bild auf einen Webserver
FF_SetCurrentFTPDir
Setzt das Startverzeichnis für Pfad- und Datei-Auswahl auf dem FTP-Server.
FF_WriteFTPFile
Kopiert eine Datei auf den FTP-Server
Dazu einige fragmentarische Anmerkungen:

FF_OpenFTP

Das Öffnen der FTP-Verbindung ist Voraussetzung für die Anwendung fast aller weiteren FTP-Funktionen mit Ausnahme von FF_SaveFTP.
Wenn das Ergebnis = false ist, ist die Verbindung fehl geschlagen. FF erzeugt dann eigene Fehlermeldungen wie z.B.:
  1. Die Serververbindung konnte nicht hergestellt werden.
  2. Das Kennwort war unzulässig

zu 1. - Ursache ist wahrscheinlich, dass keine Internetverbindung besteht oder auf den FTP-Server kann nicht zugegriffen werden.
zu 2. - Der Benutzername oder das Passwort ist falsch.

FF_CloseFTP

Wurde eine FTP-Verbindung erfolgreich geöffnet, sollte man sie nach Ausführung aller gewünschten FTP-Funktionen mit diesem Befehl wieder schließen.

FF_SaveFTP

Diese Funktion erfordert kein vorheriges Öffnen der FTP-Verbindung, da dieser Befehl mit Hilfe der notwendigen Zugangsdaten in den Parametern die Verbindung selbst herstellen kann.

FF_WriteFTPFile

Eine auf dem Server bereits vorhandene Datei wird ohne Rückfrage überschrieben. Eine Sicherheitsabfrage kann mit der Funktion FF_FTPFileExists erstellt werden.
Vor dem Kopieren muss man mit FF_SetCurrentFTPDir das gewünschte Ablageverzeichnis setzen.
Wenn das Ergebnis = false ist, war die Übertragung fehlerhaft.

FF_SetCurrentFTPDir

Erwartet wird der gesamte Pfad beginnend ab dem Server-Wurzelverzeichnis, also z.B.
FF_SetCurrentFTPDir "/folder1/folder2/folder3"
Es gibt für Verzeichnisse kein dem Befehl FF_FTPFileExists (überprüft, ob die Datei auf dem FTP-Server existiert) entsprechenden Befehl. Stattdessen kann
geprüft werden, ob sich das betreffende Verzeichnis als Startverzeichnis für Pfad- und Datei-Auswahl setzen lässt:
If FF_SetCurrentFTPDir ("/folder1/folder2/folder3") = False Then Msgbox "folder3 existiert nicht"

FF_CreateFTPDir
Erwartet wird der gesamte Pfad beginnend ab dem Server-Wurzelverzeichnis, um einen "folder3" zu erzeugen also z.B.
FF_CreateFTPDir "/folder1/folder2/folder3"
Dabei darf die Verzeichnisangabe nicht auf einen Slash enden.
Vor der Ausführung des Befehls, sollte man die Existenz des Verzeichnis mit FF_SetCurrentFTPDir prüfen, wie bei FF_SetCurrentFTPDir beschrieben.

Zu beachten ist außerdem, dass das obige Beispiel die Existenz von folder1 und folder2 voraussetzt. Es können nicht mehrere Ebenen gleichzeitig angelegt werden. Man kann das Problem lösen, indem man rekursiv eine Ebene nach der anderen anlegt:
remotepath = "folder1/folder2/folder3"   'weder am Anfang noch am Ende ein Slash

if FF_CreateFTPDir("/" & remotepath) = false then
   Array = split(remotepath,"/")
   for each element in Array
      path = path & "/" & element
      if FF_SetCurrentFTPDir(path) = false then
         if FF_CreateFTPDir(path) = false then
            msgbox "Der Serverpfad '" & remotepath & _
            "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
            FF_CloseFTP()
            exit sub
         end if
      end if
   next
end if
 
Wenn anschließend auf dem neu angelegtem Serverpfad eine Datei abgelegt werden soll, muss dieser natürlich vorher mit FF_SetCurrentFTPDir gesetzt werden.
FF_SetCurrentFTPDir "/" & remotepath

Beispiel für FTP-Funktionen (vbs)

Es wird die Anwendung der folgenden FTP-Funktionen demonstriert:
FF_OpenFTP, FF_SetCurrentFTPDir, FF_CreateFTPDir, FF_FTPFileExists, FF_WriteFTPFile und FF_CloseFTP

Über einen Dialog kann man mit "FTP-Einstellungen" eine Maske zum Eintragen der Zugangsdaten aufrufen.
Mit Start der "FTP-Übertragung" wird das Bild auf der FF-Arbeitsfläche auf dem Server im angegebenen Verzeichnis abgelegt. Existiert das Verzeichnis nicht, wird es auf Wunsch angelegt.
Ist in den Zugangsdaten der Domainname angegeben, wird ein Link zum abgelegten Bild erzeugt und in die Zwischenablage übernommen.

Option Explicit
 
const FTP_RegSchluessel = "FTP_Ablage"            'Registryschlüssel

Dim fso                                           'Objekte
Set fso = CreateObject("Scripting.FileSystemObject")
 
Dim file,FTP_file
Dim server,remotepath,domain,user,pwd,passiveftp,bool_pFTP
'---------------------------------------------------------------------
if FF_GetImageWidth = 0 then
   msgbox "Es ist kein Bild geladen!",vbCritical,"Abbruch"
else
   call Dialog
end if
 
Set fso = nothing
'---------------------------------------------------------------------
Sub FTP_Uebertragung
Dim Antwort,path
 
'### Werteprüfung
if len(server) = 0 or len(remotepath) = 0 or len(user) = 0 then
   msgbox "Es müssen mindestens Werte für" & vbNewLine & _
         "den FTP-Server, den Serverpfad und den Benutzernamen" & vbNewLine & _
         "eingegeben werden!",vbExclamation,"Hinweis"
   call FTP_Dialog
   exit sub
end if
 
'### Passwortprüfung
if len(pwd) = 0 then
   pwd = trim(inputbox("Passwort?","Eingabeaufforderung"))
   if len(pwd) = 0 then exit sub
end if
 
'### FTP-Verbindung öffnen und Serverpfad prüfen
if FF_OpenFTP(server,user,pwd,bool_pFTP) = false then   'Verbindung öffnen
   msgbox "Die Serververbindung konnte nicht geöffnet werden",vbExclamation,"Abbruch"
   exit sub
end if
 
if FF_SetCurrentFTPDir("/" & remotepath) = false then   'Test ob Verz. vorhanden
   Antwort = msgbox("Der Serverpfad '" & remotepath & "'" & vbNewLine & _
                "existiert nicht!" & vbNewLine & _
                "Soll er angelegt werden?",vbYesNo + vbQuestion,"Abfrage")
   if Antwort = vbNo then
      FF_CloseFTP()
      exit sub
   else
      if FF_CreateFTPDir("/" & remotepath) = false then    'ggf. Verzeichnis anlegen
         Array = split(remotepath,"/")
         for each element in Array
            path = path & "/" & element
            if FF_SetCurrentFTPDir(path) = false then
               if FF_CreateFTPDir(path) = false then
                  msgbox "Der Serverpfad '" & remotepath & _
                  "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
                  FF_CloseFTP()
                  exit sub
               end if
            end if
         next
      end if
      if FF_SetCurrentFTPDir("/" & remotepath) = false then
         msgbox "Der Serverpfad '" & remotepath & _
               "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
         FF_CloseFTP()
         exit sub
      end if
   end if
end if
 
'### Testen ob Bild bereits auf dem Server existiert
file = FF_GetImageName(-1)                         'Bildpfad für aktives Bild ermitteln
FTP_file = fso.GetFileName(file)
if FF_FTPFileExists(FTP_file) then                 'Sicherheitsabfrage wenn Bild vorhanden
   Antwort = msgbox("Das Bild '" & fso.GetFileName(file) & "' ist bereits" & vbNewLine & _
                "im Webpfad '" & remotepath & "' abgelegt." & vbNewLine & vbNewLine & _
                "Soll es überschrieben werden?",vbYesNo + vbQuestion,"Abfrage")
    if Antwort = vbNo then
        FF_CloseFTP()
        exit sub
    end if
end if
 
'### Bild auf dem Server ablegen und den Link in die Zwischenablage übernehmen
if FF_WriteFTPFile(file,FTP_file) then                       'Bild auf dem Server ablegen
   if len(domain) > 0 then
      call FF_TextToClipboard(domain & "/" & remotepath & "/" & FTP_file) 'Zwischenablage
      msgbox "Das Bild wurde erfolgreich abgelegt!" & vbNewLine & _
            "Der Link" & vbNewLine & _
            domain & "/" & remotepath & "/" & FTP_file & vbNewLine & _
            "wurde in die Zwischenablage übernommen.",vbInformation,"Bildlink"
   else
      msgbox "Das Bild wurde erfolgreich abgelegt!" & vbNewLine & _
            "Da die Domain nicht angegeben ist, kann" & vbNewLine & _
            "kein Link erzeugt werden.",vbInformation,"Hinweis"
   end if
else
   msgbox "Bei der Übertragung ist ein Fehler aufgetreten!",vbExclamation,"Abbruch"
end if
 
'### FTP-Verbindung schließen
FF_CloseFTP()
 
End Sub
'---------------------------------------------------------------------
Sub Dialog
 
'** Start Dialog FTP-Ablage **
FF_AddDialog "FTP-Ablage",81,45
FF_AddControl "FTP-Ablage","FTP-Einstellungen","BUTTON",14,6,52,11
FF_AddControl "FTP-Ablage","FTP-Übertragung","BUTTON",14,26,52,11
'** End Dialog FTP-Ablage **

call FTP_RegistryLesen
 
do
   Select Case FF_ShowDialog ("FTP-Ablage")
   Case "FTP-Einstellungen"
      call FTP_Dialog
   Case "FTP-Übertragung"
      call FTP_Uebertragung
      exit do
   Case "CANCEL"
      exit do
   Case Else
   End Select
loop
 
FF_CloseDialog ("FTP-Ablage")
 
End Sub
'---------------------------------------------------------------------
Sub FTP_Dialog
 
'** Start Dialog FTP-Zugang **
FF_AddDialog "FTP-Zugang",160,82
FF_AddControl "FTP-Zugang","FTP-Server","STATIC",5,5,40,10
FF_AddControl "FTP-Zugang","server","SLEDIT",50,5,105,10
FF_AddControl "FTP-Zugang","Serverpfad","STATIC",5,15,40,10
FF_AddControl "FTP-Zugang","remotepath","SLEDIT",50,15,105,10
FF_AddControl "FTP-Zugang","Domainname","STATIC",5,25,40,10
FF_AddControl "FTP-Zugang","domain","SLEDIT",50,25,105,10
FF_AddControl "FTP-Zugang","Benutzername","STATIC",5,35,40,10
FF_AddControl "FTP-Zugang","user","SLEDIT",50,35,105,10
FF_AddControl "FTP-Zugang","Passwort","STATIC",5,45,40,10
FF_AddControl "FTP-Zugang","pwd","SLEDIT",50,45,105,10
FF_SetControlStyle "FTP-Zugang","pwd",32
FF_AddControl "FTP-Zugang","Passiv FTP","STATIC",15,68,28,10
FF_AddControl "FTP-Zugang","passiveftp","BOOL",4,69,8,8
FF_AddControl "FTP-Zugang","Ist kein Passwort eingegeben, wird es jeweils abgefragt.","STATIC",5,56,150,8
FF_AddControl "FTP-Zugang","?","BUTTON",84,68,11,11
FF_AddControl "FTP-Zugang","Übernehmen","BUTTON",112,68,38,11
'** End Dialog FTP-Zugang **

'### Werte in Dialog eintragen
FF_SetControl "FTP-Zugang","server",server
FF_SetControl "FTP-Zugang","remotepath",remotepath
FF_SetControl "FTP-Zugang","domain",domain
FF_SetControl "FTP-Zugang","user",user
FF_SetControl "FTP-Zugang","pwd",pwd
FF_SetControl "FTP-Zugang","passiveftp",passiveftp
 
do
   Select Case FF_ShowDialog ("FTP-Zugang")
   Case "?"
      Msgbox    "- FTP-Server (unbedingt notwendig)" & vbNewLine & _
            "FTP-Adresse des Webservers (z.B. meineseite.de)" & vbNewLine & vbNewLine & _
            "- Serverpfad (unbedingt notwendig)" & vbNewLine & _
            "Verzeichnis in das die Bilder abgelegt werden sollen (z.B. bilder)" & vbNewLine & _
            "Existiert das Verzeichnis nicht, wird es auf Wunsch angelegt." & vbNewLine & vbNewLine & _
            "- Domainname" & vbNewLine & _
            "URL des Webspaces (z.B. http://www.meineseite.de)" & vbNewLine & _
            "Er wird nur zur Erzeugung eines Link auf das abgelegte Bild benötigt."& vbNewLine & vbNewLine & _
            "- Benutzername (unbedingt notwendig)" & vbNewLine & _
            "Benutzername zum Einloggen auf dem FTP-Server" & vbNewLine & vbNewline & _
            "- Passwort" & vbNewLine & _
            "Passwort zum Einloggen auf dem FTP-Server." & vbNewLine & _
            "Wird kein Passwort eingegeben, wird es jeweils abgefragt." & vbNewLine & vbNewLine & _
            "- Passiv-FTP" & vbNewLine & _
            "Wird eine Firewall benutzt, ist dieses Kästchen anzuhaken, falls" & vbNewLine & _
            "die FTP-Verbindung nicht zustande kommt.",vbInformation,"Erläuterung zum FTP-Zugang"
   Case "Übernehmen"
      call FTP_RegistrySchreiben
      exit do
   Case "CANCEL"
      exit do
   Case Else
   End Select
loop
 
FF_CloseDialog ("FTP-Zugang")
 
End Sub
'-------------------------------------------------------------------
Sub FTP_RegistryLesen
'Schlüsselname = HKEY_CURRENT_USER\Software\Joachim Koopmann Software\FixFoto\Script\ & FTP_RegSchluessel

'### Werte aus Registry auslesen
server = FF_GetProfile (FTP_RegSchluessel,"server")
remotepath = FF_GetProfile (FTP_RegSchluessel,"remotepath")
domain = FF_GetProfile (FTP_RegSchluessel,"domain")
user = FF_GetProfile (FTP_RegSchluessel,"user")
pwd = FF_GetProfile (FTP_RegSchluessel,"pwd")
passiveftp = FF_GetProfile (FTP_RegSchluessel,"passiveftp")
if passiveftp = "" then passiveftp = 0
if passiveftp = 0 then bool_pFTP = false else bool_pFTP = true
 
End Sub
'---------------------------------------------------------------------
Sub FTP_RegistrySchreiben
'Schlüsselname = HKEY_CURRENT_USER\Software\Joachim Koopmann Software\FixFoto\Script\ & FTP_RegSchluessel

'### Werte aus Dialog auslesen
server = trim(FF_GetControl("FTP-Zugang","server"))
 
remotepath = trim(FF_GetControl("FTP-Zugang","remotepath"))
if remotepath = "/" then remotepath = ""
do
   if left(remotepath,1) = "/" and len(remotepath) > 1 then
      remotepath = mid(remotepath,2)
   else
      exit do
   end if
loop
do
   if right(remotepath,1) = "/" and len(remotepath) > 1 then
      remotepath = left(remotepath,len(remotepath)-1)
   else
      exit do
   end if
loop
 
domain = trim(FF_GetControl("FTP-Zugang","domain"))
user = trim(FF_GetControl("FTP-Zugang","user"))
pwd = trim(FF_GetControl("FTP-Zugang","pwd"))
passiveftp = trim(FF_GetControl("FTP-Zugang","passiveftp"))
if passiveftp = 0 then bool_pFTP = false else bool_pFTP = true
 
'### Werte in Registry schreiben
FF_WriteProfile FTP_RegSchluessel,"server",server
FF_WriteProfile FTP_RegSchluessel,"remotepath",remotepath
FF_WriteProfile FTP_RegSchluessel,"domain",domain
FF_WriteProfile FTP_RegSchluessel,"user",user
FF_WriteProfile FTP_RegSchluessel,"pwd",pwd
FF_WriteProfile FTP_RegSchluessel,"passiveftp",passiveftp
 
End Sub
'---------------------------------------------------------------------
Überträgt man den Link in die Adresszeile eines Browsers, kann man direkt überprüfen, ob das Bild ordnungsgemäß abgelegt wurde.

Vorhandene FTP-Daten auslesen


Statt die FTP-Daten vom User in eine Maske eintragen zu lassen, kann man auch die ggf. in den Optionen des Speicherdialogs von FixFoto eingegebenen Daten auslesen.

'### FixFoto-FTP-Daten aus der Registry auslesen
const FF_FTP_Reg = "HKCU\Software\Joachim Koopmann Software\FixFoto\Options\"
Dim server,remotepath,domain,user,pwd,passiveftp
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
 
On Error Resume Next
 
server = WshShell.RegRead (FF_FTP_Reg & "FTPServer")
remotepath = WshShell.RegRead (FF_FTP_Reg & "FTPPath")
domain = WshShell.RegRead (FF_FTP_Reg & "FTPDPath")
user = WshShell.RegRead (FF_FTP_Reg & "FTPUser")
pwd = WshShell.RegRead (FF_FTP_Reg & "FTPPwd")
passiveftp = WshShell.RegRead (FF_FTP_Reg & "PassiveFTP")
 
On Error GoTo 0
 
Während des Auslesens müssen Fehlermeldungen mit On Error Resume Next ausgbelendet werden, weil nicht vorhandene Daten einen Fehler erzeugen.


Wenn anschließend auf dem neu angelegtem Serverpfad eine Datei abgelegt werden soll, muss dieser natürlich vorher mit FF_SetCurrentFTPDir gesetzt werden.