InetGet sehr unzuverlässig

  • Hi Leute,
    ich schreibe gerade ein Programm, welches Dateien von etwa 120MB aus einer Dropbox herunterlädt.
    Jedoch stoße ich dabei mit InetGet häufig auf das Problem, dass der Download häufig unvollständig ist.
    Beim Download der Datei mit einem "normalen" Browser (Firefox,Chrome etc.) habe ich keine Probleme.
    Mit kleinen Dateien über InetGet gibt es auch keine Probleme.
    Ich könnte natürlich auch den großen Download parten, das würde ich aber nur machen,wenn alle Stricke reißen.
    Meine aktuelle Funktion zum Download in den Temp:

    Spoiler anzeigen
    [autoit]


    Func _processDownload($sDownloadLink,$sTargettemp)
    Global $sfullpathtemp = @TempDir & "\" & $sTargettemp
    Local $sDownload = InetGet($sDownloadLink,$sfullpathtemp,1,1)
    Do
    sleep(200)
    Until InetGetInfo($sDownload, 2)
    If not FileExists($sfullpathtemp) Then
    $sDownload = InetGet($sDownloadLink,$sfullpathtemp,1,1)
    Do
    sleep(200)
    Until InetGetInfo($sDownload, 2)
    If Not FileExists($sfullpathtemp) Then
    MsgBox(48,"ERROR","Konnte Datei nicht vom Server herunterladen, Download abgebrochen")
    GUISetState(@SW_HIDE)
    GuiDelete($Form_main1)
    maintool()
    Elseif Not FileGetSize($sfullpathtemp) = InetGetSize($sDownloadLink) Then
    MsgBox(48,"ERROR","Datei konnte nach zwei Versuchen nicht vollständig heruntergeladen werden, Download abgebrochen")
    GUISetState(@SW_HIDE)
    GuiDelete($Form_main1)
    maintool()
    EndIf
    Elseif Not FileGetSize($sfullpathtemp) = InetGetSize($sDownloadLink) Then
    $sDownload = InetGet($sDownloadLink,$sfullpathtemp,1,1)
    Do
    sleep(200)
    Until InetGetInfo($sDownload, 2)
    If Not FileExists($sfullpathtemp) Then
    MsgBox(48,"ERROR","Konnte Datei nicht vom Server herunterladen, Download abgebrochen")
    GUISetState(@SW_HIDE)
    GuiDelete($Form_main1)
    maintool()
    Elseif Not FileGetSize($sfullpathtemp) = InetGetSize($sDownloadLink) Then
    MsgBox(48,"ERROR","Datei konnte nach zwei Versuchen nicht vollständig heruntergeladen werden, Download abgebrochen")
    GUISetState(@SW_HIDE)
    GuiDelete($Form_main1)
    maintool()
    EndIf
    EndIf
    Return $sfullpathtemp
    EndFunc

    [/autoit]


    Das Seltsame dabei ist, dass er nicht erkennt, dass die Datei kaputt ist sondern es erst das Entpackprogramm bemerkt. (7z)
    Wie kann ich die Funktion optimieren, damit solche Probleme nicht auftreten und wo liegt mein Fehler?
    Hoffentlich könnt ihr mir helfen
    Mfg Fliwatt

  • Wieso verwendest du als letzten Parameter für InetGet 1, wenn du während des Downloads nichts weiter tust als zu überprüfen ob dieser abgeschlossen ist? Das ist ein wenig.. sinnlos.
    Versuche es mal mit 0 als letztem Parameter und entferne die Endlosschleifen sowie die InetGetInfo Befehle.

  • Ich habe diese InetGetInfo Befehle extra eingefügt um in späteren Updates eine ProgressBar für den Download einzuführen zu können.
    Ich habe mir gedacht, dass ich dieses Prinzip am Besten gleich sofort einführe, damit ich es ausführlich testen kann als dass ich dann in späteren Updates Probleme habe.
    Aber anscheinend hat es so seine Macken, wie könnte ich das mit dem Download Progress denn umsetzen ohne den letzten Parameter auf 1 zu setzen?

  • Aber anscheinend hat es so seine Macken, wie könnte ich das mit dem Download Progress denn umsetzen ohne den letzten Parameter auf 1 zu setzen?


    Gar nicht da du dann ja nicht mitbekommst wieviel tatsächlich heruntergeladen wurde.

    mfg autoBert

  • Das heisst ich muss auf diese "Unzuverlässigkeit" setzen, wenn ich dieses Feature noch mit drin haben will,
    oder ich mache es total unsauber und packe den Downloader extern in einen zweiten Prozess und der primäre Prozess überprüft dann die Dateigröße und gibt demnach etwas zurück.
    Das ist mir jedoch zu umständlich, ich bin ja nicht Chrome :)
    Ich werde dann wohl die Datei parten müssen.
    Dankeschön
    Fliwatt

  • Ich verwende dazu wget und werte dies aus:

    Spoiler anzeigen
    [autoit]

    Func _GetHTMLSource(ByRef $sHTMLSource, $sDownloadLink, $sLocalPath)
    ;ConsoleWrite($sDownloadLink & ' ==> ' & $sLocalPath & @CRLF)
    $sDownloadLink = StringReplace($sDownloadLink, ' ', '_')
    Local $sLine, $aTmp, $iPercent, $bSuccess, $iKBs
    If Not FileExists($sLocalPath) Then
    $iPid = Run(@ScriptDir & '\wget -O "' & $sLocalPath & '" ' & $sDownloadLink & '"', @ScriptDir, @SW_HIDE, $STDERR_CHILD)
    While ProcessExists($iPid)
    _EventHandler()
    $sLine = StderrRead($iPid)
    $aTmp = _StringBetween($sLine, "saved [", "]")
    If Not IsArray($aTmp) Then
    $aTmp = _StringBetween($sLine, ".", "%")
    If IsArray($aTmp) Then
    $iPercent = StringStripWS(StringReplace($aTmp[0], ".", ""), 7)
    If Int($iPercent) < 1 Then
    $iPercent = "0 %"
    Else
    $iPercent &= " %"
    EndIf
    GUICtrlSetData($idPrgGesamt, $iPercent)
    EndIf
    $aTmp = _StringBetween($sLine, "%", " KB/s")
    If IsArray($aTmp) Then
    $iKBs = StringReplace(StringStripWS($aTmp[0], 7), ".", ",") & " KB/s"
    GUICtrlSetData($idLblKBSEC, $iKBs)
    EndIf
    Else
    $aTmp = StringSplit($aTmp[0], "/")
    If $aTmp[0] = 2 And $aTmp[1] = $aTmp[2] Then $bSuccess = True
    EndIf
    ;ConsoleWrite($sLine)
    WEnd
    EndIf
    $sHTMLSource = StringReplace(StringReplace(FileRead($sLocalPath), @LF, @CRLF), @CRLF & @LF, @CRLF)
    ;FileWrite(StringReplace($sLocalPath, '.html', '.txt'), $sHTMLSource)
    EndFunc ;==>_GetHTMLSource

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

    Func _EventHandler()
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    _exitMain()
    EndSwitch
    EndFunc ;==>_EventHandler

    [/autoit]

    Bei der angehängten Datei musst du nur die '.txt'-Endung entfernen. WGet ist sehr tolerant und bricht deshalb sehr selten ab. Deshalb muss ich noch eine Funktion einbauen welche nach einer gewissen Zeit die kb/s leert.

    mfg autoBert

    • Offizieller Beitrag


    Das Seltsame dabei ist, dass er nicht erkennt, dass die Datei kaputt ist sondern es erst das Entpackprogramm bemerkt. (7z)
    Wie kann ich die Funktion optimieren, damit solche Probleme nicht auftreten und wo liegt mein Fehler?

    Ich sehe in Deiner Funktion kein InetClose. Wenn das Handle nicht geschlossen ist, dann ist die Datei möglicherweise auch nicht komplett gespeichert.