Wie der Titel schon sagt, geht es um einen FTP-Uploader. Dieser hier funktioniert jetzt aber so, dass ein Ordner (oder Festplatte...) angegeben wird, indem das Programm automatisch alle Ordner und Unterordner (und Unterunterordner....) nach Dateien mit einem bestimmten Alter sucht - einstellbar im Input.
Sinnvoll einsetzbar ist das Programm zum Beispiel bei Frontpage-Usern, da Frontpage (wie ich gehört habe) keinen automatischen Fileupload der veränderten Files anbietet und da man nicht weiß, in welchen Unterordner Frontpage weitere Files geändert hat, man immer den ganzen Frontpageordner hochladen muss, was unter Umständen sehr lange dauert. Der Uploader findet die veränderten Files und lädt sie automatisch in das richtige Verzeichnis hoch.
Durch AutoUpdate ist es zum Beispiel auch möglich, sich einen Update Ordner auf der Festplatte anzulegen, diesen im Input auszuwählen und dann einfach immer alle Files die man hochladen möchte, da reinzustecken. Um den FTP-Upload braucht man sich dann überhaupt nicht mehr kümmern, da das Programm dann alles weitere im Hintergrund macht.
Ein weiteres Feature ist die Anzeige des Fortschritts des Uploads über Multithreading, wer also schon immer mal wissen wollte, wie man das einfach umsetzen kann in Autoit, sollte auf jeden Fall einen Blick draufwerfen.
(Danke an Florian 'Piccaso' Fida für die Multithreading UDF autoitscript.com.)
Ein weiteres Dankeschön geht natürlich an Wouter van Kesteren für die FTP-UDF autoitscript.com.
Das Ganze ist noch nicht in der endgültigen Version, der Progress funktioniert zum Beispiel im Moment nur, wenn der Basefolder wirklich genau dem Folder entspricht, der später im Link nicht erscheint. Bei meinem Webserver würde ich zum Beispiel eine Datei *.* nach tubesbest.de/htdocs/*.* hochladen, im Basefolder-Input müsste dann /htdocs/ stehen, da der Link zum File tubesbest.de/*.* heißt.
Auch die GUI sieht noch nicht sehr schön aus, aber das ist ja erstmal nicht so wichtig
Spoiler anzeigen
#include "coproc.au3"
#include "ftp.au3"
#include <GUIConstants.au3>
#Include <File.au3>
#Include <Array.au3>
#include <Date.au3>
$iPidChild = _CoProc(Default, "_progress") ; Create new Procces, Set _recv() as Reciever function
Func _progress($vParm)
$array=StringSplit($vParm,"&")
$file_to_upload=$array[1]
$path_to_destination=$array[2]
$ftp_server=$array[3]
$ftp_user=$array[4]
$ftp_pw=$array[5]
$dllhandle = DllOpen('wininet.dll')
$Open = _FTPOpen ('MyFTP Control')
$Conn = _FTPConnect ($Open, $ftp_server, $ftp_user, $ftp_pw)
$Ftpp = _FtpPutFile ($Conn, $file_to_upload, $path_to_destination)
If $Ftpp = 0 Then
MsgBox(0, "Fehler", "Fileupload war nicht erfolgreich!")
EndIf
DllClose($dllhandle)
EndFunc
$ftp_server = IniRead("ftp.ini", "ftp_input", "server", "ftp_server")
$ftp_user = IniRead("ftp.ini", "ftp_input", "user", "ftp_user")
$ftp_pw = IniRead("ftp.ini", "ftp_input", "pw", "ftp_pw")
$folder = IniRead("ftp.ini", "wayne", "folder", "folder")
$timespace = IniRead("ftp.ini", "wayne", "timespace", "5")
$base_folder = IniRead("ftp.ini", "wayne", "base_folder", "/htdocs/")
#Region ### START Koda GUI section ### Form=D:\AutoIt3\Eigene Skripte\frontpage upload\AForm1.kxf
$Form1 = GUICreate("FTP Upload", 625, 445, 174, 114)
$folder_input = GUICtrlCreateInput($folder, 20, 40, 250, 20)
$Button_folder = GUICtrlCreateButton("Durchsuchen....", 280, 40, 89, 20, 0)
$ftp_server_input = GUICtrlCreateInput($ftp_server, 465, 165, 140, 21)
$ftp_user_input = GUICtrlCreateInput($ftp_user, 465, 195, 140, 21)
$ftp_pw_input = GUICtrlCreateInput($ftp_pw, 465, 225, 140, 21, $ES_PASSWORD)
$base_folder_input = GUICtrlCreateInput($base_folder, 465, 255, 140, 21)
$Label1 = GUICtrlCreateLabel("Server (z.B. ftp.example.com):", 315, 165, 145, 20)
$Label2 = GUICtrlCreateLabel("User (z.B. secretuser):", 315, 195, 108, 20)
$Label3 = GUICtrlCreateLabel("Passwort (z.B. hidden):", 315, 225, 112, 20)
$Label7 = GUICtrlCreateLabel("Base folder (z.B. /htdocs/):", 315, 255, 145, 20)
$Label4 = GUICtrlCreateLabel("Frontpage - Ordner:", 20, 20, 96, 20)
$Label5 = GUICtrlCreateLabel("Zeitfenster (in min.):", 20, 70, 96, 20)
$button_search = GUICtrlCreateButton("Files suchen", 150, 90, 80, 20)
$timespace_input = GUICtrlCreateInput($timespace, 20, 90, 120, 20, $ES_NUMBER)
GUICtrlCreateUpdown(-1)
$list_files = GUICtrlCreateList("", 20, 155, 250, 123, BitOR($WS_BORDER, $WS_VSCROLL, $WS_HSCROLL))
$Label6 = GUICtrlCreateLabel("Dateien zum Hochladen:", 20, 135, 121, 20)
$button_upload = GUICtrlCreateButton("Hochladen", 20, 285, 75, 25, 0)
$search_status = GUICtrlCreateLabel("", 240, 90, 360, 60)
$search_time = GUICtrlCreateLabel("", 170, 110, 60, 20)
$checkbox_ask = GUICtrlCreateCheckbox("Vor Upload nachfragen", 400, 30, 220, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
$checkbox_autoupdate = GUICtrlCreateCheckbox("Autoupdate", 400, 60, 220, 20)
$progress_state_total_files = GUICtrlCreateLabel("Uploading:",20,330,400,20)
$progress_total_files = GUICtrlCreateProgress(20,355,200,20)
$progress_state_single_file = GUICtrlCreateLabel("0% Done",20,415,100,20)
$progress_single_file = GUICtrlCreateProgress(20,390,200,20)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $added_files[10000]
Global $files[1]
Global $number_added_files = 0
Global $func_founded_files = 0
Global $timer_autoupdate = 0
Global $timer = 0
$timer_autoupdate = TimerInit()
While 1
Sleep(20)
If GUICtrlRead($checkbox_autoupdate) = $GUI_CHECKED Then
$timer_autoupdate_dif = TimerDiff($timer_autoupdate)
If Round($timer_autoupdate_dif / 1000 / 60) >= GUICtrlRead($timespace_input) Then
_autoupdate()
$timer_autoupdate = TimerInit()
EndIf
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
$ftp_server = GUICtrlRead($ftp_server_input)
$ftp_user = GUICtrlRead($ftp_user_input)
$ftp_pw = GUICtrlRead($ftp_pw_input)
$folder = GUICtrlRead($folder_input)
$timespace = GUICtrlRead($timespace_input)
$base_folder = GUICtrlRead($base_folder_input)
IniWrite("ftp.ini", "ftp_input", "server", $ftp_server)
IniWrite("ftp.ini", "ftp_input", "user", $ftp_user)
IniWrite("ftp.ini", "ftp_input", "pw", $ftp_pw)
IniWrite("ftp.ini", "wayne", "folder", $folder)
IniWrite("ftp.ini", "wayne", "timespace", $timespace)
IniWrite("ftp.ini", "wayne", "base_folder", $base_folder)
Exit
Case $button_search
_search()
Case $button_upload
_upload()
Case $Button_folder
$selected_folder = FileSelectFolder("Ordner wählen", "")
If $selected_folder <> "" Then
If StringRight($selected_folder, 1) <> "\" Then $selected_folder &= "\"
GUICtrlSetData($folder_input, $selected_folder)
EndIf
EndSwitch
WEnd
Func _get_files_and_subfolders($dir, $timespace)
GUICtrlSetData($search_status, $dir)
$timer_dif = TimerDiff($timer)
GUICtrlSetData($search_time, "time: " & Round($timer_dif / 1000) & "s")
$FileList = _FileListToArray($dir)
If @error = 1 Then
MsgBox(0, "", "No Files\Folders Found.")
Exit
EndIf
If IsArray($FileList) Then
For $i = 1 To $FileList[0]
If FileGetAttrib($dir & $FileList[$i]) = "D" Then
_get_files_and_subfolders($dir & $FileList[$i] & "\", $timespace)
Else
$array = FileGetTime($dir & $FileList[$i])
;MsgBox(0,"", _NowCalcDate() & " " & @HOUR & ":" & @MIN & ":" & @SEC & @crlf & $array[0] & "/" & $array[1] & "/" & $array[2] & " " & $array[3] & ":" & $array[4] & ":" & $array[5] & @crlf & _DateDiff("n", _NowCalcDate() & " " & @HOUR & ":" & @MIN & ":" & @SEC, $array[0] & "/" & $array[1] & "/" & $array[2] & " " & $array[3] & ":" & $array[4] & ":" & $array[5]))
If Abs(_DateDiff("n", _NowCalcDate() & " " & @HOUR & ":" & @MIN & ":" & @SEC, $array[0] & "/" & $array[1] & "/" & $array[2] & " " & $array[3] & ":" & $array[4] & ":" & $array[5])) <= GUICtrlRead($timespace_input) Then
_ArrayAdd($files, $dir & $FileList[$i])
$func_founded_files += 1
GUICtrlSetData($list_files, $func_founded_files & ". " & $dir & $FileList[$i])
EndIf
EndIf
Next
EndIf
EndFunc ;==>_get_files_and_subfolders
Func _upload($ask=1)
$ftp_server = GUICtrlRead($ftp_server_input)
$ftp_user = GUICtrlRead($ftp_user_input)
$ftp_pw = GUICtrlRead($ftp_pw_input)
$dllhandle = DllOpen('wininet.dll')
$Open = _FTPOpen ('MyFTP Control')
$Conn = _FTPConnect ($Open, $ftp_server, $ftp_user, $ftp_pw)
If @error Then MsgBox(0, "Error", "Connection fehlgeschlagen: " & @error)
;MsgBox(0,"","Server: " & $ftp_server & @CR & "Username: " & $ftp_user & @CR & "Passwort: " & $ftp_pw)
$dir = GUICtrlRead($folder_input)
$length = StringLen($dir)
$base_folder = GUICtrlRead($base_folder_input)
For $i = 1 To $number_added_files
$tmp_file = StringTrimLeft($added_files[$i], $length)
$tmp_file = StringReplace($tmp_file, "\", "/")
$tmp_file = $base_folder & $tmp_file
$tmp_file = StringReplace($tmp_file, " ", "")
$array_split = StringSplit($tmp_file, "/")
$do_update = 1
If GUICtrlRead($checkbox_ask) = $GUI_CHECKED And $ask=1 Then
If MsgBox(4, "FTP Upload", "Wollen Sie " & @CRLF & "'" & $added_files[$i] & "'" & @CRLF & "nach" & @CRLF & "'" & $tmp_file & "'" & @CRLF & "uploaden?") <> 6 Then
$do_update = 0
EndIf
EndIf
If $do_update = 1 Then
$make_dir_path = "/"
For $s = 2 To $array_split[0] - 1
$make_dir_path = $make_dir_path & $array_split[$s] & "/"
;If MsgBox(4,"FTP Dir Create","Wollen Sie den Ordner " & "'" & $make_dir_path & "'" & " erstellen?")=6 Then
_FTPMakeDir ($Conn, $make_dir_path)
;EndIf
Next
$size_upload_file = FileGetSize($added_files[$i])
$path_to_uploaded_file = "http://" & GUICtrlRead($ftp_server_input) & "/"
$base_folder = GUICtrlRead($base_folder_input)
$path_to_uploaded_file = $path_to_uploaded_file & StringRight($tmp_file, StringLen($tmp_file) - StringLen($base_folder))
;MsgBox(0,"",$path_to_uploaded_file)
;Run("progressbar.exe " & '"' & $size_upload_file & '" "' & $path_to_uploaded_file & '" "' & $added_files[$i] & '" "' & $i & '" "' & $number_added_files & '"')
_CoProcSend($iPidChild,$added_files[$i] & '&' & $tmp_file & '&' & $ftp_server & '&' & $ftp_user & '&' & $ftp_pw)
GUICtrlSetData($progress_state_total_files,"Uploading (" & $i & "/" & $number_added_files & "): " & $added_files[$i] )
GUICtrlSetData($progress_total_files,$i/$number_added_files *100)
$DestFileSize = 1
While $DestFileSize < $size_upload_file
Sleep(100)
$DestFileSize = InetGetSize($path_to_uploaded_file)
$Percent = round(($DestFileSize/$size_upload_file )*100,0)
GUICtrlSetData($progress_single_file,$Percent)
GUICtrlSetData($progress_state_single_file,$Percent & "% done")
WEnd
EndIf
Next
$Ftpc = _FTPClose ($Open)
DllClose($dllhandle)
EndFunc ;==>_upload
Func _search()
GUICtrlSetData($list_files, "")
$number_added_files = 0
$timer = TimerInit()
_get_files_and_subfolders(GUICtrlRead($folder_input), GUICtrlRead($timespace_input))
$timer_dif = TimerDiff($timer)
GUICtrlSetData($search_status, "Suche beendet nach " & Round($timer_dif / 1000) & " Sekunden" & @CRLF & $func_founded_files & " " & sing_plur($func_founded_files,"Datei","Dateien")& " gefunden")
GUICtrlSetData($search_time, "")
$func_founded_files = 0
For $i = 1 To UBound($files) - 1
$number_added_files += 1
$added_files[$number_added_files] = $files[$i]
;GUICtrlSetData($list_files, $number_added_files & ". " & $files[$i])
Next
For $i = UBound($files) - 1 To 1 Step - 1
_ArrayDelete($files, $i)
Next
EndFunc ;==>_search
Func _autoupdate()
_search()
_upload(0)
EndFunc ;==>_autoupdate
Func sing_plur($var, $singular, $plural)
If $var = 1 Then
Return $singular
Else
Return $plural
EndIf
EndFunc ;==>x
Alles anzeigen