FtpPutFile - Wie viel ist bereits hochgeladen ?

  • Hey,

    Ich habe vor, bzw wir haben vor, ein kleines FTP-Upload-Programm zu schreiben.
    Fakt ist aber, dass wir daran scheitern, den Fortschritt von _FTPPutFile abzufragen.

    Wir haben bereits versucht, das mit einem nebenherlaufenden Script zu lösen,
    das die Größe der Datei auf dem Server abfragt, also mit InetGetSize.

    Problem:
    Sowohl das Script als auch der IE und FireFox geben nur '0' aus, bis der Upload abgeschlossen ist.
    Die Frage ist also, ob man nicht auf anderem Wege feststellen kann, wie viel bereits mit
    der FtpPutFile-Funktion auf den Server geladen wurde ?
    Denn bei größeren Dateien (und überhaupt) ist es sehr angenehm zu sehen, wie weit der
    Upload ist ;)

    Ich hoffe mal, es gibt eine andere Antwort als "Ich glaube nicht",

    Gruß
    limette =)

    PS.:
    Hier dieser erste Ansatz:

    Spoiler anzeigen
    [autoit]

    While 1
    Sleep( 100 )
    $s = InetGetSize( "pfad_zur_datei" )
    ToolTip( $s, 0, 0 )
    WEnd

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <FTP.au3>
    $server = 'server'
    $username = 'user'
    $pass = 'pw'

    [/autoit] [autoit][/autoit] [autoit]

    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $put = _FTPPutFile( $Conn, 'hallo.txt', '/hallo.txt' )
    ;Die Hallo.txt ist in diesem Fall über 377 kB groß ;)

    [/autoit]

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Hmmm, hast Du dir das hier mal angesehen ?

    FTP-Uploader

    Wenn ich mir das Beispielbild ansehe, beinhaltet es genau das wonach Du suchst, oder ?
    [Blockierte Grafik: http://xs122.xs.to/xs122/07526/ftpuploader.jpg]

    [autoit]

    $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

    [/autoit]


    Gruß
    Greenhorn


  • Also,
    _FTPGetFileSize
    kann ich in meiner ftp.au3 nicht finden, muss ich mir vll ne neue Version von holen,

    und ja, das Beispielbild habe ich gesehen.
    Und wenn du dir den von dir angehängten Code ansiehst - das ist genau das gleiche,
    was wir auch schon versucht haben ;)

    Schonmal danke, ich suche mal nach der _FTPGetFileSize - Funktion =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Ahhh, danke =)
    Werd ich gleich mal ausprobieren =)

    Edit:
    Irgendwie komm ich damit nicht klar.
    Bei der 'neuen' FTP.au3 müssen schon bei dem _FtpConnect neue Parameter
    angegeben werden.
    Was zum Henker soll $i_passive sein ?! Ist auch in der UDF nicht erklärt..

    Edit2:
    Ok, ich muss also bei $i_passive entweder 1 oder 2 angeben.
    Und der DllOpen vorweg darf nicht fehlen, auch klar.

    Und trotzdem - bei _FTPGetFileSize
    öffnet sich bei mir nur der 'Just-in-Time-Debugger' von Visual Studio
    mit einer 'Unbehandelten Win32 Ausnahme in AutoIt3.exe [2888]'
    ...

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    2 Mal editiert, zuletzt von limette (29. Dezember 2007 um 17:58)

  • Bitte sehr ...

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Function Name: _FTPGetFileSize()
    ; Description: Gets filesize of a file on the FTP server.
    ; Parameter(s): $l_FTPSession - The Long from _FTPConnect()
    ; $s_FileName - The file name.
    ; Requirement(s): DllCall, wininet.dll
    ; Return Value(s): On Success - 1
    ; On Failure - 0
    ; Author(s): J.o.a.c.h.i.m. d.e. K.o.n.i.n.g.
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _FTPGetFileSize($l_FTPSession, $s_FileName)

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_FTPGetSizeHandle = DllCall('wininet.dll', 'int', 'FtpOpenFile', 'long', $l_FTPSession, 'str', $s_FileName, 'long', 0x80000000, 'long', 0x04000002, 'long', 0)
    If @error OR $ai_FTPGetSizeHandle[0] = 0 Then
    MsgBox(16,"Error", "FTPOpenFile Failed; Handle = " & $ai_FTPGetSizeHandle[0])
    SetError(-1)
    Return 0
    EndIf
    Local $ai_FTPGetFileSize = DllCall('wininet.dll', 'int', 'FtpGetFileSize', 'long', $ai_FTPGetSizeHandle[0])
    If @error OR $ai_FTPGetFileSize[0] = 0 Then
    MsgBox(16,"Error", "FTPGetFileSize Failed; Handle = " & $ai_FTPGetFileSize[0])
    SetError(-1)
    Return 0
    EndIf
    DllCall('wininet.dll', 'int', 'InternetCloseHandle', 'str', $ai_FTPGetSizeHandle)

    [/autoit] [autoit][/autoit] [autoit]

    Return $ai_FTPGetFileSize[0]

    EndFunc;==> _FTPGetFileSize()

    [/autoit]

    Gruß
    Greenhorn

    Edit: Zeige doch bitte mal den ganzen Code für die Upload-Geschichte.
    Vielleicht liegt der Fehler ja woanders. Probiere doch mal das Upload Tool ..., wenn es funzt, dann weisst Du, dass es mit InetGetSize geht .... ;)


    Einmal editiert, zuletzt von Greenhorn (30. Dezember 2007 um 05:02)

  • Den ganzen Code ?
    Das ist der ganze Code ^^
    Natürlich ist das Script eig. wesentlich länger, aber ich habe diesen kleinen Teil isoliert und
    als extra Scripte erstellt, zum Testen halt.
    Je weniger Code desto besser lassen sich Fehler ausfindig machen und beheben ;)

    Also:
    Das oben beschriebene ist / war der ganze Code, wie ich ihn in einem 'test-script' halt.. teste ^^
    Bis auf die Tatsache, dass ich halt die Funktion InetGetSize durch _FTPGetFileSize ersetzt habe.
    Aber wie gesagt -
    _FTPGetFileSize scheint nicht zu funktionieren...

    Auf die Idee, die Funktion so zu modifizieren, dass man die Stelle sieht, an der der Fehler auftritt, bin ich auch schon gekommen ;)
    Der Dll-Call für den Handle ist noch kein Problem, die Werte kann ich mir noch als Array anzeigen lassen,
    der DllCall mit 'FTPGetFileSize' endet in der genannten Meldung des Debuggers...

    Und wenn das bei dem UploadTool wirklich so mit InetGetSize geht...
    dann liegt es wohl eher am Server ?
    Ich werd das mal testen..

    limette


    Edit:
    Ich hab das Upload-Tool mal getestet - auch hier wird der Status der aktuellen Datei nicht richtig angezeigt,-
    und noch schlimmer: Die InetGetSize-Funktion scheint immer 0 auszugeben,
    daher wird nur die erste Datei hochgeladen und das Script hängt in der Schleife fest,
    'While $destination_file_size < $lokal_file_size' oder so in der Art ;)
    Mal ne andere Frage:
    Funktioniert das bei euch denn einwandfrei ? Auch die _FTPGetFileSize - Funktion ?

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    2 Mal editiert, zuletzt von limette (31. Dezember 2007 um 12:12)

  • Hallo, ich habe auch die gleiche Frage und wollte kein extra Thema aufmachen (hoffe ich bin kein Leichenschänder... das Thema hier ist ja schon lange tot^^):

    Ich möchte in einer Progressbar anzeigen lassen, wieviel % schon hochgeladen wurden. Das Problem ist aber, das das Script bei _FTPPutFile() solange angehalten wird, bis es fertig geuploadet hat. Wie bekomme ich es hin, das das Script weiterläuft und gleichzeitig im Hintergrund hochgeladen wird?!

    Danke!

  • Hallo, ich habe auch die gleiche Frage und wollte kein extra Thema aufmachen (hoffe ich bin kein Leichenschänder... das Thema hier ist ja schon lange tot^^):

    oh doch das is sowas von leichengeschändet :D

    hab da mal ne udf für einen download mit processbar von Scripter192
    vllt hilft dir die ja weiter, bzw vllt kannst du sie für deine zwecke umbauen.

    aber aufpassen:
    Zitat aus UDF: Anhänge: Diese Datei darf nicht ohne vorherige bestätigung druch mich verändert werden!

    Spoiler anzeigen
    [autoit]

    #include-once
    #cs ----------------------------------------------------------------------------
    dl.au Version 1.0.0

    Beschreibung: Erlaubt das schnelle erstellen von einer Download interface mit Prozentangabe und abbrech- Funkion

    Autor: Scripter192

    Anhänge: Diese Datei darf nicht ohne vorherige bestätigung druch mich verändert werden!


    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; #INDEX# =========================================================================================
    ; Title .........: dl
    ; AutoIt Version : 3.2.3++
    ; Language ..... : Deutsch
    ; Description ...: Verschiedene Download Funktionen...
    ; =================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #CURRENT# =======================================================================================
    ;_ColorConvertHSLtoRGB
    ;_ColorConvertRGBtoHSL
    ;_ColorGetBlue
    ;_ColorGetGreen
    ;_ColorGetRed
    ; =================================================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name...........: _download
    ; Description ...: Läd die angegebene Datei "konfortabel" herunter und Speichert sie. Informationen wie Geschwindigkeit und Bisher gedownloadet werden angezeigt!
    ; Syntax.........: _ColorConvertHSLtoRGB($avArray)
    ; Parameters ....: $url - Internetadresse, der zu downloadeden Datei. Bsp.: "http://beispiel.de/ordner/datei.exe"
    ; $save - Speicherort+Speichername Bsp.: "C:\Doumente und Einstellungen\datei.Execute"
    ; $titel - Titel der Über der Progress Bar erscheint. Bsp.: "Datei wird heruntergeladen"
    ; $exitmsg - Nachricht beim Klick auf Abbrechen. Bsp.: "Wirklich Abbrechen?"&@crlf&"Wenn du Abbrichst wird die Datei nicht gedownloadet!"
    ; Rückgabewerte .: Erfolg - Gibt 1 zurück
    ; Fehler - Gibt 0 zurück, @error enthält 1
    ; Author ........: Scripter192
    ; =================================================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _download($url, $save, $titel = "Downloading...", $exitmsg = "Wollen sie wirklich abbrechen?")
    $size = InetGetSize($url)
    If $size = 0 Then
    SetError(0, 1, 0)
    Else
    $gui = GUICreate("Downloading...", 295, 106, 195, 125)
    $Progress1 = GUICtrlCreateProgress(16, 32, 262, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 152, 80, 75, 17, 0)
    $Label1 = GUICtrlCreateLabel($titel, 16, 8, 265, 20)
    GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("%", 16, 56, 268, 17)
    $Button1 = GUICtrlCreateButton("Info", 64, 80, 75, 17, 0)
    GUISetState(@SW_SHOW)
    $info = 0
    $exit = 0
    InetGet($url, $save, 0, 1)
    $timer = TimerInit()
    $prozentold = 0
    Do
    $msg = GUIGetMsg()
    Switch $msg
    Case $Abbrechen
    $answer = MsgBox(52, "Abbruch", $exitmsg)
    If $answer = 6 Then $exit = 1
    Case $Button1
    If $info = 0 Then
    $pos = WinGetPos($gui)
    $guii = GUICreate("Downloading...", 296, 307, $pos[0], $pos[1])
    $Progress1 = GUICtrlCreateProgress(16, 32, 262, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 152, 280, 75, 17, 0)
    $Label1 = GUICtrlCreateLabel($titel, 16, 8, 265, 20)
    GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel($prozentold & "%", 16, 56, 268, 17)
    $Button1 = GUICtrlCreateButton("Verbergen", 64, 280, 75, 17, 0)
    $Label3 = GUICtrlCreateLabel("Download von:", 16, 88, 76, 17)
    $Label4 = GUICtrlCreateLabel($url, 16, 104)
    $Label5 = GUICtrlCreateLabel("Größe:", 16, 128, 36, 17)
    $Label6 = GUICtrlCreateLabel(Round($size / 1000, 2) & ' KBytes', 16, 144)
    $Label7 = GUICtrlCreateLabel("Bisher kopiert:", 16, 168, 71, 17)
    $Label8 = GUICtrlCreateLabel("---", 16, 184, 277, 17)
    $Label9 = GUICtrlCreateLabel("Geschwindigkeit:", 16, 208, 85, 17)
    $Label10 = GUICtrlCreateLabel("---", 16, 232, 277, 17)
    GUISetState(@SW_SHOW)
    GUIDelete($gui)
    $info = 1
    Else
    $pos = WinGetPos($guii)
    $gui = GUICreate("Downloading...", 295, 106, $pos[0], $pos[1])
    $Progress1 = GUICtrlCreateProgress(16, 32, 262, 17)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 152, 80, 75, 17, 0)
    $Label1 = GUICtrlCreateLabel($titel, 16, 8, 265, 20)
    GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel($prozentold & "%", 16, 56, 268, 17)
    $Button1 = GUICtrlCreateButton("Info", 64, 80, 75, 17, 0)
    GUISetState(@SW_SHOW)
    GUIDelete($guii)
    $info = 0
    EndIf
    EndSwitch
    Sleep(50) ; ==> DEBUG
    $Prozent = Round(@InetGetBytesRead / $size * 100, 0)
    If $prozentold <> $Prozent Then
    If StringIsAlNum($Prozent) Then
    GUICtrlSetData($Label2, $Prozent & '%')
    GUICtrlSetData($Progress1, $Prozent)
    $prozentold = $Prozent
    EndIf
    EndIf
    If $info = 1 Then
    GUICtrlSetData($Label8, Round(@inetgetbytesread / 1000, 2) & ' KBytes')
    GUICtrlSetData($Label10, 'Durchschnittlich: ' & Round((@inetgetbytesread / 1000) / (TimerDiff($timer) / 1000), 2) & ' kbytes/sek')
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Until $exit = 1 Or @InetGetActive = 0
    Return 1
    EndIf
    EndFunc ;==>_download

    [/autoit]
  • Ich denke er ist auf der Suche nach einer Upload-Funktion ?

    Also, die Lösung damals war folgende:
    Wir haben eine neue Funktion, _FTPUploadProgress o.ä. geschrieben, soll heißen
    ich habe das damals begonnen und Progandy hat das ganze dann zum laufen gebracht ;)

    Zu finden unter
    Erweiterte FTP-Funktionen - FTP.au3 / FTP_Ex.au3
    läuft über 'InternetWriteFile', du kannst dabei eine Funktion als Parameter übergeben,
    welche deinen Statusbalken aktualisiert ;)

    Hoffe das hilft,

    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.