FTP Datei herunterladen

  • Hallo Leute,

    ich bin neu hier im Forum und habe gleich mal zwei Fragen. Ich hänge seit ca. 2 Stunden an einem Problem.
    Und zwar möchte ich vom FTP Server von Adobe den Adobe Reader über AutoIT herunterladen.

    Ich lese hierzu aus einer Configfile Folgende Werte aus.

    Code: Listftp.ini
    [adobereader]
    URL="ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi"
    NAME="adobe_reader.msi"

    Ich muss die Datei leider über den FTP herunterladen da nur die .MSI Datei ohne Benutzereingaben installiert werden kann.

    Das Skript dazu:

    Code
    $DownloadURL = IniRead("Listftp.ini","adobereader","URL","")
    $FileNAME = IniRead("Listftp.ini","adobereader","NAME","")


    Nun möchte ich, dass ich diese Datei einfach herunterladen kann.
    Wenn ich es allerdings über die _FTP_XXX Funktionen mache müsste ich ja erst den Link zerlegen.
    Was ja dann so Aussehen würde. (erstmal von Hand zerlegt zum Testen)

    Code: Download.au3
    $sServer = 'ftp.adobe.com'
    $sUsername = ''
    $sPass = ''
    $hOpen = _FTP_Open('MyFTP Control')
    $hConn = _FTP_Connect($hOpen, $sServer, $sUsername, $sPass)
    _FTP_FileGet($hConn,'/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi',$FileNAME)

    Allerdings funktioniert der Download nicht.

    Ebenfalls habe ich es schon über InetGet getestet, wobei ich auch hier die Datei nicht herunterladen kann.

    Meine 2 Fragen sind jetzt:

    1. Kann ich auch einen leichteren Weg nehmen um die Datei herunterzuladen? (in AutoIT)

    Wenn es keinen leichteren Weg ohne die Zerlegung des Linkes gibt dann die zweite Frage.

    2. Habe ich beim Download.au3 Script einen Fehler gemacht?


    Gruß Stiefel94

    • Offizieller Beitrag

    Die zweite Frage zuerst: Ja, Du hast Fehler gemacht! Es fehlt #include <FTPEx.au3> und Du musst die Variable $FileNAME auch mit einem Dateinamen füllen und die Handles solltest Du auch wieder schließen!
    Aber um auch die erste Frage zu beantworten: Ja, es geht auch anders/leichter. Siehe hier:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <InetConstants.au3>
    #include <Misc.au3>
    #include <WinAPIMisc.au3>

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

    $sFilePath = @ScriptDir & '\AdbeRdr11000_de_DE.msi'
    $sInetPath = 'ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi'
    $hDownload = InetGet($sInetPath, $sFilePath, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
    $hDLL = DllOpen("user32.dll")
    $iTimer = TimerInit()
    Do
    If TimerDiff($iTimer) > 250 Then
    $iTimer = TimerInit()
    ToolTip(_WinAPI_StrFormatKBSize(InetGetInfo($hDownload, $INET_DOWNLOADREAD)) & ' / ' & _WinAPI_StrFormatKBSize(InetGetInfo($hDownload, $INET_DOWNLOADSIZE)))
    EndIf
    Sleep(10)
    If _IsPressed('1B', $hDLL) Then ExitLoop
    Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE)
    DllClose($hDLL)
    InetClose($hDownload)

    [/autoit]
    • Offizieller Beitrag

    Oder Du benutzt meine UDF "_DownloadWithProgress" (siehe Anhang! Die Datei muss sich im Scriptverzeichnis befinden):

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

    #include '_DownloadWithProgress.au3'

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

    Global $sURL = 'ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi'
    Global $sDownloadDir = @ScriptDir
    _DownloadWithProgress($sURL, $sDownloadDir)

    [/autoit]
  • Hallo Leute,

    danke erstmal für die schnellen Antworten.
    @AspirinJunkie Ich habe die Hilfe schon gewälzt wie ein blöder und bin da leider nicht weitergekommen. Deswegen habe ich hier auch gefragt. Aber danke ich weiß es gibt viele die vor der Hilfe erst mal hier schreiben. Von daher finde ich es auch nicht schlimm das du mich darauf hinweist.

    @Oscar Der $FileNAME wird aus der INI Datei ausgelesen. Den Include habe ich weiter oben im Script schon mit drinnen. Aber funktionieren will es leider nicht.
    Ich werde jetzt mal dein Script testen welches du mir im ersten Beitrag gegeben hast.

    Zu deinem zweiten Script (_DownloadWithProgress), wird da eine Progressbar angezeigt?

    Edit:

    @Oscar Ich habe nun beide Scripte von dir ohne Änderungen getestet. Aber sie laden leider beide die Datei nicht herunter. Das erste Skript zeigt mir nur den ToolTip an der Maus mit ( 0 / 0 KB) und das andere hängt sich bei der Ausführung in der GUI auf.

    Grüße Stiefel94

    Einmal editiert, zuletzt von Stiefel94 (14. April 2015 um 09:51)

  • Ich habe dir keinen allgmeinen Hinweis zum lesen der Hilfe gegeben, sondern eine ganz konkrete Funktion benannt.
    Diese hast du aber anscheinend immer noch nicht angesehen/probiert sonst würdest du ja deinen Versuch hier posten um dir damit weiterhelfen zu können.

    Folgendes funktioniert bei mir absolut problemlos:

    [autoit]

    $DownloadURL = "ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi"
    $FileNAME = "adobe_reader.msi"

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

    InetGet($DownloadURL, @ScriptDir & "\" & $FileNAME)
    MsgBox(0,"", "Download fertig")

    [/autoit]

    Auch die FTP-Funktionen erbringen das gewünschte Resultat bei mir:

    FTP-Download mit ausführlicher
    [autoit]

    #include <FTPEx.au3>
    #include <Array.au3>

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

    Global $hOpen = _FTP_Open('MyFTP Control')
    Global $hConn = _FTP_Connect($hOpen, "ftp.adobe.com", '', '')

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

    $dRet = _FTP_FileGet($hConn, "/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi", @ScriptDir & "\adobe_reader.msi")
    If @error Then GetAllNetworkErrors($dRet)

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

    _FTP_Close($hConn)
    _FTP_Close($hOpen)

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

    Func GetAllNetworkErrors(Const $ReturnValue = "", Const $err = @error, Const $ext = @extended)
    ; by AspirinJunkie
    Local $h_K32 = DllOpen("kernel32.dll")
    Local $dFTPError, $sFTPMessage

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

    Local $a_DllRet = DllCall($h_K32, "dword", "GetLastError")
    Local $d_APIError = @error ? 0 : $a_DllRet[0]
    Local $a_DllRet = DllCall("Wininet.dll", 'bool', 'InternetGetLastResponseInfoW', 'dword*', 0, 'wstr', "", 'dword*', 4096)
    Local $s_InetError = @error ? 0 : $a_DllRet[1]
    Local $s_InetErrorMsg = @error ? "" : $a_DllRet[2]
    Local $a_DllRet = DllCall($h_K32, "dword", "FormatMessageW", _
    "dword", 0x1100, _ ; Flags
    "ptr", 0, _ ; Source (hier unwichtig)
    "dword", $d_APIError, _ ; Error-Code
    "dword", 1031, _ ; Language-ID (per _WinAPI_MAKELANGID ermittelbar)
    "wstr*", "", _ ; Buffer für Ausgabestring
    "DWORD", 0, _ ; Buffersize (hier automatisch durch entsprechendes Flag)
    "ptr", 0)
    DllClose($h_K32)
    Local $s_APIMessage = @error Or $d_APIError == 0 ? "" : $a_DllRet[5]
    MsgBox(0, "Error-Report", ($ReturnValue ? "Return: " & $ReturnValue & @CRLF : "") & "@error: " & $err & @CRLF & "@extended: " & $ext & @CRLF & "API-Error: " & $d_APIError & " - " & $s_APIMessage & @CRLF & "WinINet-Error: " & $s_InetError & " - " & $s_InetErrorMsg)
    EndFunc ;==>GetAllFTPErrors

    [/autoit]

    3 Mal editiert, zuletzt von AspirinJunkie (14. April 2015 um 12:51)

  • Hallo @AspirinJunkie

    Ich muss mich erst mal bei dir entschuldigen. Ich wollte nicht das es so rüber kommt. Ich habe natürlich schon mit InetGet versucht die Daten herunterzuladen. Doch leider passiert dort ebenfalls nichts. Ich habe noch ein weiteres Script mit dem ich über InetGet normale Downloads durchführen kann aber leider keine FTP Downloads. Ich habe dein Script getestet aber auch dieses will bei mir einfach nichts herunterladen.

    Und es tut mir wirklich nochmal leid das ich so auf deinen Post reagiert habe.

    Hier ist nochmal das Script mit welchem ich es getestet habe. Der Name und der Link werden aus der weiter unten folgenden List.ini ausgelesen.

    [autoit]


    #include <InetConstants.au3>
    #Include <File.au3>
    #Include <Array.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <FTPEx.au3>
    #include <Misc.au3>
    #include <WinAPIMisc.au3>

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

    $httplist = "List.ini"

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

    $ahttpArray = IniReadSectionNames($httplist)

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

    If Not @error Then
    For $i = 1 To $ahttpArray[0]
    $DownloadURL = IniRead($httplist,$ahttpArray[$i],"URL","")
    $FileNAME = IniRead($httplist,$ahttpArray[$i],"NAME","")
    InetGet ($DownloadURL,$FileNAME)
    Next
    EndIf

    [/autoit]
    Code: List.ini
    [adobereader]
    URL="ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/de_DE/AdbeRdr11000_de_DE.msi"
    NAME="adobe_reader.msi"


    Grüße Steve

    • Offizieller Beitrag

    Zu deinem zweiten Script (_DownloadWithProgress), wird da eine Progressbar angezeigt?

    Edit:

    @Oscar Ich habe nun beide Scripte von dir ohne Änderungen getestet. Aber sie laden leider beide die Datei nicht herunter. Das erste Skript zeigt mir nur den ToolTip an der Maus mit ( 0 / 0 KB) und das andere hängt sich bei der Ausführung in der GUI auf.

    Bei mir lädt er bei beiden die Datei runter und speichert sie im Scriptverzeichnis.
    Welche AutoIt-Version benutzt Du?
    Befindet sich das Script möglicherweise in einem schreibgeschützen Verzeichnis?