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:

  1. If FF_SetCurrentFTPDir ("/folder1/folder2/folder3") = False Then Msgbox "folder3 existiert nicht"
  2. \\ **FF_CreateFTPDir**\\ Erwartet wird der gesamte Pfad beginnend ab dem Server-Wurzelverzeichnis, um einen "folder3" zu erzeugen also z.B.\\
  3. FF_CreateFTPDir "/folder1/folder2/folder3"
  4. 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:\\
  5. remotepath = "folder1/folder2/folder3" 'weder am Anfang noch am Ende ein Slash
  6.  
  7. if FF_CreateFTPDir("/" & remotepath) = false then
  8. Array = split(remotepath,"/")
  9. for each element in Array
  10. path = path & "/" & element
  11. if FF_SetCurrentFTPDir(path) = false then
  12. if FF_CreateFTPDir(path) = false then
  13. msgbox "Der Serverpfad '" & remotepath & _
  14. "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
  15. FF_CloseFTP()
  16. exit sub
  17. end if
  18. end if
  19. next
  20. 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.

  1. Option Explicit
  2.  
  3. const FTP_RegSchluessel = "FTP_Ablage" 'Registryschlüssel
  4.  
  5. Dim fso 'Objekte
  6. Set fso = CreateObject("Scripting.FileSystemObject")
  7.  
  8. Dim file,FTP_file
  9. Dim server,remotepath,domain,user,pwd,passiveftp,bool_pFTP
  10. '---------------------------------------------------------------------
  11. if FF_GetImageWidth = 0 then
  12. msgbox "Es ist kein Bild geladen!",vbCritical,"Abbruch"
  13. else
  14. call Dialog
  15. end if
  16.  
  17. Set fso = nothing
  18. '---------------------------------------------------------------------
  19. Sub FTP_Uebertragung
  20. Dim Antwort,path
  21.  
  22. '### Werteprüfung
  23. if len(server) = 0 or len(remotepath) = 0 or len(user) = 0 then
  24. msgbox "Es müssen mindestens Werte für" & vbNewLine & _
  25. "den FTP-Server, den Serverpfad und den Benutzernamen" & vbNewLine & _
  26. "eingegeben werden!",vbExclamation,"Hinweis"
  27. call FTP_Dialog
  28. exit sub
  29. end if
  30.  
  31. '### Passwortprüfung
  32. if len(pwd) = 0 then
  33. pwd = trim(inputbox("Passwort?","Eingabeaufforderung"))
  34. if len(pwd) = 0 then exit sub
  35. end if
  36.  
  37. '### FTP-Verbindung öffnen und Serverpfad prüfen
  38. if FF_OpenFTP(server,user,pwd,bool_pFTP) = false then 'Verbindung öffnen
  39. msgbox "Die Serververbindung konnte nicht geöffnet werden",vbExclamation,"Abbruch"
  40. exit sub
  41. end if
  42.  
  43. if FF_SetCurrentFTPDir("/" & remotepath) = false then 'Test ob Verz. vorhanden
  44. Antwort = msgbox("Der Serverpfad '" & remotepath & "'" & vbNewLine & _
  45. "existiert nicht!" & vbNewLine & _
  46. "Soll er angelegt werden?",vbYesNo + vbQuestion,"Abfrage")
  47. if Antwort = vbNo then
  48. FF_CloseFTP()
  49. exit sub
  50. else
  51. if FF_CreateFTPDir("/" & remotepath) = false then 'ggf. Verzeichnis anlegen
  52. Array = split(remotepath,"/")
  53. for each element in Array
  54. path = path & "/" & element
  55. if FF_SetCurrentFTPDir(path) = false then
  56. if FF_CreateFTPDir(path) = false then
  57. msgbox "Der Serverpfad '" & remotepath & _
  58. "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
  59. FF_CloseFTP()
  60. exit sub
  61. end if
  62. end if
  63. next
  64. end if
  65. if FF_SetCurrentFTPDir("/" & remotepath) = false then
  66. msgbox "Der Serverpfad '" & remotepath & _
  67. "' konnte nicht angelegt werden",vbExclamation,"Abbruch"
  68. FF_CloseFTP()
  69. exit sub
  70. end if
  71. end if
  72. end if
  73.  
  74. '### Testen ob Bild bereits auf dem Server existiert
  75. file = FF_GetImageName(-1) 'Bildpfad für aktives Bild ermitteln
  76. FTP_file = fso.GetFileName(file)
  77. if FF_FTPFileExists(FTP_file) then 'Sicherheitsabfrage wenn Bild vorhanden
  78. Antwort = msgbox("Das Bild '" & fso.GetFileName(file) & "' ist bereits" & vbNewLine & _
  79. "im Webpfad '" & remotepath & "' abgelegt." & vbNewLine & vbNewLine & _
  80. "Soll es überschrieben werden?",vbYesNo + vbQuestion,"Abfrage")
  81. if Antwort = vbNo then
  82. FF_CloseFTP()
  83. exit sub
  84. end if
  85. end if
  86.  
  87. '### Bild auf dem Server ablegen und den Link in die Zwischenablage übernehmen
  88. if FF_WriteFTPFile(file,FTP_file) then 'Bild auf dem Server ablegen
  89. if len(domain) > 0 then
  90. call FF_TextToClipboard(domain & "/" & remotepath & "/" & FTP_file) 'Zwischenablage
  91. msgbox "Das Bild wurde erfolgreich abgelegt!" & vbNewLine & _
  92. "Der Link" & vbNewLine & _
  93. domain & "/" & remotepath & "/" & FTP_file & vbNewLine & _
  94. "wurde in die Zwischenablage übernommen.",vbInformation,"Bildlink"
  95. else
  96. msgbox "Das Bild wurde erfolgreich abgelegt!" & vbNewLine & _
  97. "Da die Domain nicht angegeben ist, kann" & vbNewLine & _
  98. "kein Link erzeugt werden.",vbInformation,"Hinweis"
  99. end if
  100. else
  101. msgbox "Bei der Übertragung ist ein Fehler aufgetreten!",vbExclamation,"Abbruch"
  102. end if
  103.  
  104. '### FTP-Verbindung schließen
  105. FF_CloseFTP()
  106.  
  107. End Sub
  108. '---------------------------------------------------------------------
  109. Sub Dialog
  110.  
  111. '** Start Dialog FTP-Ablage **
  112. FF_AddDialog "FTP-Ablage",81,45
  113. FF_AddControl "FTP-Ablage","FTP-Einstellungen","BUTTON",14,6,52,11
  114. FF_AddControl "FTP-Ablage","FTP-Übertragung","BUTTON",14,26,52,11
  115. '** End Dialog FTP-Ablage **
  116.  
  117. call FTP_RegistryLesen
  118.  
  119. do
  120. Select Case FF_ShowDialog ("FTP-Ablage")
  121. Case "FTP-Einstellungen"
  122. call FTP_Dialog
  123. Case "FTP-Übertragung"
  124. call FTP_Uebertragung
  125. exit do
  126. Case "CANCEL"
  127. exit do
  128. Case Else
  129. End Select
  130. loop
  131.  
  132. FF_CloseDialog ("FTP-Ablage")
  133.  
  134. End Sub
  135. '---------------------------------------------------------------------
  136. Sub FTP_Dialog
  137.  
  138. '** Start Dialog FTP-Zugang **
  139. FF_AddDialog "FTP-Zugang",160,82
  140. FF_AddControl "FTP-Zugang","FTP-Server","STATIC",5,5,40,10
  141. FF_AddControl "FTP-Zugang","server","SLEDIT",50,5,105,10
  142. FF_AddControl "FTP-Zugang","Serverpfad","STATIC",5,15,40,10
  143. FF_AddControl "FTP-Zugang","remotepath","SLEDIT",50,15,105,10
  144. FF_AddControl "FTP-Zugang","Domainname","STATIC",5,25,40,10
  145. FF_AddControl "FTP-Zugang","domain","SLEDIT",50,25,105,10
  146. FF_AddControl "FTP-Zugang","Benutzername","STATIC",5,35,40,10
  147. FF_AddControl "FTP-Zugang","user","SLEDIT",50,35,105,10
  148. FF_AddControl "FTP-Zugang","Passwort","STATIC",5,45,40,10
  149. FF_AddControl "FTP-Zugang","pwd","SLEDIT",50,45,105,10
  150. FF_SetControlStyle "FTP-Zugang","pwd",32
  151. FF_AddControl "FTP-Zugang","Passiv FTP","STATIC",15,68,28,10
  152. FF_AddControl "FTP-Zugang","passiveftp","BOOL",4,69,8,8
  153. FF_AddControl "FTP-Zugang","Ist kein Passwort eingegeben, wird es jeweils abgefragt.","STATIC",5,56,150,8
  154. FF_AddControl "FTP-Zugang","?","BUTTON",84,68,11,11
  155. FF_AddControl "FTP-Zugang","Übernehmen","BUTTON",112,68,38,11
  156. '** End Dialog FTP-Zugang **
  157.  
  158. '### Werte in Dialog eintragen
  159. FF_SetControl "FTP-Zugang","server",server
  160. FF_SetControl "FTP-Zugang","remotepath",remotepath
  161. FF_SetControl "FTP-Zugang","domain",domain
  162. FF_SetControl "FTP-Zugang","user",user
  163. FF_SetControl "FTP-Zugang","pwd",pwd
  164. FF_SetControl "FTP-Zugang","passiveftp",passiveftp
  165.  
  166. do
  167. Select Case FF_ShowDialog ("FTP-Zugang")
  168. Case "?"
  169. Msgbox "- FTP-Server (unbedingt notwendig)" & vbNewLine & _
  170. "FTP-Adresse des Webservers (z.B. meineseite.de)" & vbNewLine & vbNewLine & _
  171. "- Serverpfad (unbedingt notwendig)" & vbNewLine & _
  172. "Verzeichnis in das die Bilder abgelegt werden sollen (z.B. bilder)" & vbNewLine & _
  173. "Existiert das Verzeichnis nicht, wird es auf Wunsch angelegt." & vbNewLine & vbNewLine & _
  174. "- Domainname" & vbNewLine & _
  175. "URL des Webspaces (z.B. http://www.meineseite.de)" & vbNewLine & _
  176. "Er wird nur zur Erzeugung eines Link auf das abgelegte Bild benötigt."& vbNewLine & vbNewLine & _
  177. "- Benutzername (unbedingt notwendig)" & vbNewLine & _
  178. "Benutzername zum Einloggen auf dem FTP-Server" & vbNewLine & vbNewline & _
  179. "- Passwort" & vbNewLine & _
  180. "Passwort zum Einloggen auf dem FTP-Server." & vbNewLine & _
  181. "Wird kein Passwort eingegeben, wird es jeweils abgefragt." & vbNewLine & vbNewLine & _
  182. "- Passiv-FTP" & vbNewLine & _
  183. "Wird eine Firewall benutzt, ist dieses Kästchen anzuhaken, falls" & vbNewLine & _
  184. "die FTP-Verbindung nicht zustande kommt.",vbInformation,"Erläuterung zum FTP-Zugang"
  185. Case "Übernehmen"
  186. call FTP_RegistrySchreiben
  187. exit do
  188. Case "CANCEL"
  189. exit do
  190. Case Else
  191. End Select
  192. loop
  193.  
  194. FF_CloseDialog ("FTP-Zugang")
  195.  
  196. End Sub
  197. '-------------------------------------------------------------------
  198. Sub FTP_RegistryLesen
  199. 'Schlüsselname = HKEY_CURRENT_USER\Software\Joachim Koopmann Software\FixFoto\Script\ & FTP_RegSchluessel
  200.  
  201. '### Werte aus Registry auslesen
  202. server = FF_GetProfile (FTP_RegSchluessel,"server")
  203. remotepath = FF_GetProfile (FTP_RegSchluessel,"remotepath")
  204. domain = FF_GetProfile (FTP_RegSchluessel,"domain")
  205. user = FF_GetProfile (FTP_RegSchluessel,"user")
  206. pwd = FF_GetProfile (FTP_RegSchluessel,"pwd")
  207. passiveftp = FF_GetProfile (FTP_RegSchluessel,"passiveftp")
  208. if passiveftp = "" then passiveftp = 0
  209. if passiveftp = 0 then bool_pFTP = false else bool_pFTP = true
  210.  
  211. End Sub
  212. '---------------------------------------------------------------------
  213. Sub FTP_RegistrySchreiben
  214. 'Schlüsselname = HKEY_CURRENT_USER\Software\Joachim Koopmann Software\FixFoto\Script\ & FTP_RegSchluessel
  215.  
  216. '### Werte aus Dialog auslesen
  217. server = trim(FF_GetControl("FTP-Zugang","server"))
  218.  
  219. remotepath = trim(FF_GetControl("FTP-Zugang","remotepath"))
  220. if remotepath = "/" then remotepath = ""
  221. do
  222. if left(remotepath,1) = "/" and len(remotepath) > 1 then
  223. remotepath = mid(remotepath,2)
  224. else
  225. exit do
  226. end if
  227. loop
  228. do
  229. if right(remotepath,1) = "/" and len(remotepath) > 1 then
  230. remotepath = left(remotepath,len(remotepath)-1)
  231. else
  232. exit do
  233. end if
  234. loop
  235.  
  236. domain = trim(FF_GetControl("FTP-Zugang","domain"))
  237. user = trim(FF_GetControl("FTP-Zugang","user"))
  238. pwd = trim(FF_GetControl("FTP-Zugang","pwd"))
  239. passiveftp = trim(FF_GetControl("FTP-Zugang","passiveftp"))
  240. if passiveftp = 0 then bool_pFTP = false else bool_pFTP = true
  241.  
  242. '### Werte in Registry schreiben
  243. FF_WriteProfile FTP_RegSchluessel,"server",server
  244. FF_WriteProfile FTP_RegSchluessel,"remotepath",remotepath
  245. FF_WriteProfile FTP_RegSchluessel,"domain",domain
  246. FF_WriteProfile FTP_RegSchluessel,"user",user
  247. FF_WriteProfile FTP_RegSchluessel,"pwd",pwd
  248. FF_WriteProfile FTP_RegSchluessel,"passiveftp",passiveftp
  249.  
  250. End Sub
  251. '---------------------------------------------------------------------
  252. Ü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.

  1. '### FixFoto-FTP-Daten aus der Registry auslesen
  2. const FF_FTP_Reg = "HKCU\Software\Joachim Koopmann Software\FixFoto\Options\"
  3. Dim server,remotepath,domain,user,pwd,passiveftp
  4. Dim WshShell
  5. Set WshShell = CreateObject("WScript.Shell")
  6.  
  7. On Error Resume Next
  8.  
  9. server = WshShell.RegRead (FF_FTP_Reg & "FTPServer")
  10. remotepath = WshShell.RegRead (FF_FTP_Reg & "FTPPath")
  11. domain = WshShell.RegRead (FF_FTP_Reg & "FTPDPath")
  12. user = WshShell.RegRead (FF_FTP_Reg & "FTPUser")
  13. pwd = WshShell.RegRead (FF_FTP_Reg & "FTPPwd")
  14. passiveftp = WshShell.RegRead (FF_FTP_Reg & "PassiveFTP")
  15.  
  16. 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.