===== FTP-Funktionen =====
\\ Es gibt eine Reihe von FF-Scriptbefehlen zur Datenübertragung nach dem File Transfer Protocol (FTP):\\
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_CloseFTP.html|FF_CloseFTP]]\\ | Schließt die bestehende FTP-Verbindung\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_CreateFTPDir.html|FF_CreateFTPDir]]\\ | Erstellt ein Verzeichnis auf dem FTP-Server\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_DeleteFTPDir.html|FF_DeleteFTPDir]]\\ | Löscht ein Verzeichnis auf dem FTP-Server\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_DeleteFTPFile.html|FF_DeleteFTPFile]]\\ | Löscht eine Datei vom FTP-Server\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_ListFTPDirs.html|FF_ListFTPDirs]]\\ | Liefert Verzeichnisse im aktuellen Pfad mit CRLF getrennt\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_FTPCommand.html|FF_FTPCommand]]\\ | Führt einen [[https://web.archive.org/web/20100125192307/http://people.ucalgary.ca/~physed/mmi/ftp-manual.html|FTP-Befehl]] aus\\ |
| [[http://www.fixfoto.info/onlinehilfe/index.html?HH_FF_FTPFileExists|FF_FTPFileExists]]\\ | Überprüft, ob die Datei auf dem FTP-Server existiert\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_GetCurrentFTPDir.html|FF_GetCurrentFTPDir]]\\ | Liefert das aktuelle Verzeichnis auf dem FTP-Server\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_ListFTPFiles.html|FF_ListFTPFiles]]\\ | Liefert Dateien im aktuellen Pfad mit CRLF getrennt\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_OpenFTP.html|FF_OpenFTP]]\\ | Öffnet eine FTP-Verbindung\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_ReadFTPFile.html|FF_ReadFTPFile]]\\ | Kopiert eine Datei vom FTP-Server auf den lokalen Rechner\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_RenameFTPFile.html|FF_RenameFTPFile]]\\ | Benennt eine Datei auf dem FTP-Server um\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_SaveFTP.html|FF_SaveFTP]]\\ | Lädt ein Bild auf einen Webserver\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_SetCurrentFTPDir.html|FF_SetCurrentFTPDir]]\\ | Setzt das Startverzeichnis für Pfad- und Datei-Auswahl auf dem FTP-Server.\\ |
| [[http://www.fixfoto.info/onlinehilfe/HH_FF_WriteFTPFile.html|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.:\\
- Die Serververbindung konnte nicht hergestellt werden.
- 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.