Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Kommunikation und Netzwerk

k24:k24.2:k24.2.7:start

24.2.7 Klasse DownloadManager

Die Klasse DownloadManager (gb.net.curl) implementiert einen Manager, der eine Liste von Downloads abarbeitet. Sie fügen ihm eine Liste der URLs hinzu, deren Inhalt heruntergeladen werden soll.

Der Download-Manager verarbeitet die Downloads transparent im Hintergrund und löst dabei Ereignisse aus, so dass Sie stets wissen, was passiert.

So erzeugen Sie einen DownloadManager und fügen zum Beispiel zwei Download-Adressen hinzu:

Private $hManager As DownloadManager

$hManager = New DownloadManager As "DLManager" ' "DLManager" ist der Event-Name
$hManager.MaxClient = 2

$hManager.Add("https://www.gambas-buch.de/lib/exe/fetch.php?media=24:24.1:24.1.4:dnsclient.tar.gz")
$hManager.Add("https://www.gambas-buch.de/lib/exe/fetch.php?media=24:24.4.1:smtp.client-0.6.1.tar.gz")

24.2.7.1 Eigenschaften

Die Klasse DownloadManager verfügt über folgende Eigenschaften:

EigenschaftDatentypBeschreibung
CountIntegerGibt die Anzahl der abzuarbeitenden Downloads zurück.
MaxClientIntegerLegt die maximale Anzahl der Download-Clients fest oder gibt deren Anzahl zurück.
ProgressFloatGibt den Fortschritt für alle Downloads als reelle Zahl zwischen 0 und 1 zurück.
SizeIntegerGibt die Anzahl der herunter geladenen Bytes aller Downloads zurück.
SpeedIntegerGibt die aktuelle Download-Geschwindigkeit in Bytes/s zurück.
StateIntegerGibt den Status des DownloadManagers zurück. Die Werte sind NotReady (0), Ready (1), Downloading (2), Finnish (3) oder Error (4).

Tabelle 24.2.7.1.1 : Eigenschaften der Klasse DownloadManager

Hinweise:

  • Alle Eigenschaften – bis auf MaxClient – können nur ausgelesen werden!
  • Der Wert für die Integer-Eigenschaft MaxClient darf nur zwischen 1 und 32 liegen.
  • Mit den Werten der Eigenschaft Progress im Intervall [0,1] können Sie zum Beispiel eine Progressbar direkt ansteuern. Wenn die Eigenschaft Progressbar.Label = True ist, dann wird der Download-Fortschritt zusätzlich mit einer Prozent-Angabe angezeigt.
  • Beachten Sie: Wenn der Downloadmanager zum Beispiel 3 Download-Clients verwaltet und Download1.Status = Download.Ready ist, Download2.Status = Download.Downloaded und Download3.Status = Download.Finnish, dann wird als Status stets der höchste Wert ausgegeben → 4.

24.2.7.2 Methoden

Die Klasse DownloadManager verfügt über diese vier Methoden:

MethodeBeschreibung
Add ( URL As String [ , Key As String ] )Fügt einen URL zur Liste der abzuarbeitenden Downloads hinzu. Der Parameter Key ist optional.
Clear()Löscht die Liste (Datentyp Collection) aller vom Manager abzuarbeitenden Downloads.
Start()Startet den DownloadManager.
Stop()Stoppt den DownloadManager.

Tabelle 24.2.7.2.1 : Methoden der Klasse DownloadManager

Hinweise:

  • Wenn der optionale Parameter 'Key' in der Add(…)-Methode nicht angegeben wird, dann wird der Key auf Key = CStr($iKey) gesetzt – mit „1“ beginnend. Intern wird der Integer-Wert $iKey hochgezählt.
  • Für jeden Download ist das primäre Zielverzeichnis Temp$().
  • Sie finden zum Beispiel die Download-Datei für den 1. Download im temporären Verzeichnis: /tmp/gambas.1000/7533/1.tmp. Der Name des Unterordners 7533 entspricht der Prozess-ID des aktuellen Gambas-Prozesses.
  • Achtung: Alle Dateien, die sich im Verzeichnis /tmp/gambas.<UserId>/<ProcessId> befinden, werden automatisch gelöscht, wenn das Gambas-Programm beendet wird.
  • Daher sollten Sie diese geladenen Dateien – unter ihrem originalen Dateinamen – in einen Ordner Ihrer Wahl kopieren.

24.2.7.3 Ereignisse

Die Klasse DownloadManager verfügt über diese Ereignisse:

EreignisBeschreibung
ConnectDas Ereignis wird ausgelöst, wenn der Download-Manager gestartet wurde und sich der aktuelle Client zum Server verbunden hat.
EndDas Ereignis wird ausgelöst, wenn alle Downloads abgearbeitet wurden.
Error ( Key As String )Das Ereignis wird ausgelöst, wenn ein Fehler bei einem Download ausgelöst wird.
Finish ( Key As String )Das Ereignis wird ausgelöst, wenn ein Download beendet wurde.
ProgressDas Ereignis wird ausgelöst, wenn Daten geladen werden.
Size ( Key As String )Das Ereignis wird jeweils ausgelöst, wenn der Download-Manager die Größe der zu ladenden Download-Datei mit DownloadManager[Key].Size ausliest.

Tabelle 24.2.7.3.1 : Ereignisse der Klasse DownloadManager

Hinweise:

  • Connect: Nur für das Protokoll HTTP können Sie auch den Status auslesen.
  • Error (Key): Über den ausgelesenen Key können Sie feststellen, welcher Download fehlerhaft war.
  • Finish(Key): Welcher Download beendet wurde, können Sie über den Key ermitteln.
  • Size(Key): Für die Ermittlung der Dateigröße einer Download-Datei muss der DownloadManager nicht gestartet sein! Probleme können auftreten, wenn Weiterleitungen (Redirects) im Spiel sind. Dann lässt sich die Größe Download-Datei nicht ermitteln – es wird dann die Größe 0 zurückgegeben. Der Download wird aber ausgeführt!

24.2.7.4 Projekt

Im Projekt DLManager wird vom DownloadManager eine vorgegebene Liste von 3 Downloads verwaltet. Nach dem Programmstart wird zuerst geprüft, ob sich eine Verbindung in das Internet herstellen lässt. Dann werden alle drei Downloads ausgeführt. Der Download-Fortschritt wird für jeden Download (→ 69%) und subsummierend (→ 35%) optisch angezeigt:

Abbildung 24.2.7.4.1: GUI DownloadManager

Nach dem Ende aller Downloads werden die im vorgegebenen Basis-Verzeichnis /tmp/gambas.<UserId>/<ProcessId> gespeicherten Dateien mit ihrem originalen Datei-Namen in das Verzeichnis /home/username/Downloads/DLD kopiert (Backup):

Abbildung 24.2.7.4.2: Inhalt des Download-Ordners DLD Das Zielverzeichnis können Sie im Quelltext fest vorgeben oder im Dialog frei festlegen. Im Projekt wurde die zweite Möglichkeit nicht genutzt.

Der Quelltext wird vollständig angegeben:

' Gambas class file

Public hDownloadManager As New DownloadManager
Public sDownloadFile As New String[]

Private $iTotalSize As Integer
Private $iCurrentKey As Integer
Private $aURL As String[]
Private $aOriginalFilenames As String[]
Private $TempDirectory As String
Private $AverageSpeed As Integer

Public Sub Form_Open()

    Dim sURL As String    
    
    FMain.Resizable = False    
    MCheck.Check_Network()    
    $aURL = New String[]    
    hDownloadManager = New DownloadManager As "DLM"
    $iCurrentKey = 1
    btnBackup.Enabled = False
    
'-- Begin: Definition of the download URLs --------------------------------------------------------

    sURL = "https://www.gambas-buch.de/lib/exe/fetch.php?media=8:8.0:k8.0.pdf"
    $aURL.Add(sURL)
    hDownloadManager.Add(sURL)

    sURL = "https://www.gambas-buch.de/lib/exe/fetch.php?media=test1.zip"
    $aURL.Add(sURL)
    hDownloadManager.Add(sURL)
    
    sUrl = "https://www.gambas-buch.de/lib/exe/fetch.php?media=9:9.0:k9.0.pdf"
    $aURL.Add(sURL)
    hDownloadManager.Add(sURL)
    
'-- End: Definition of the download URLs ----------------------------------------------------------

    Select hDownloadManager.Count
      Case 1
        tblTotalSize.Text = "Größe der Download-Datei:"
      Case 2 
        tblTotalSize.Text = "Größe der beiden Download-Dateien:"
      Case 3
        tblTotalSize.Text = "Größe aller " & Str(hDownloadManager.Count) & " Download-Dateien:"
    End Select

End

Public Sub btnStart_Click()    
    $AverageSpeed = 0
    hDownloadManager.Start()    
End

Public Sub btnBackup_Click()
    Backup()
End

Public Sub DLM_Progress()
    Timer1.Start()
    ProgressBarCurrent.Value = hDownloadManager[$iCurrentKey].Current/ hDownloadManager[$iCurrentKey].Size
    ProgressBarTotal.Value = hDownloadManager.Progress
    SetStatus(hDownloadManager.State)
    lblCurrentDLSize.text = "Download Aktuell ( Key = " & $iCurrentKey & " )"
End

Public Sub DLM_Error(Key As String)
    If Not hDownloadManager[Key].ErrorText Then
       Print "No Error!"
    Else
       Print "Error = "; hDownloadManager[Key].ErrorText; " bei "; hDownloadManager[Key].Url
       hDownloadManager.Stop()
       hDownloadManager.State
    Endif
End

Public Sub DLM_End()
    SetStatus(hDownloadManager.State)    
    hDownloadManager.Stop()
    btnBackup.Enabled = True    
    Timer1.Stop()
End

Public Sub DLM_Finish(Key As String)
    Inc $iCurrentKey    
    $TempDirectory = Split(hDownloadManager[Key].Path, "/")[3]    
    Try ProgressBarCurrent.Value = hDownloadManager[Key].Current / hDownloadManager[Key].Size
End

Public Sub DLM_Size(Key As String)
    $iTotalSize += hDownloadManager[Key].Size  
    lblTotalSize.Text = Format($iTotalSize, "###,###,##0")  
End

Public Sub Timer1_Timer()
    If $AverageSpeed = 0 Then
       $AverageSpeed = hDownloadManager.Speed  'Initial speed
    Else
       $AverageSpeed = 0.9 * $AverageSpeed + 0.1 * hDownloadManager.Speed 'Floating average speed
    Endif
    lblTotalDLSize.text = "Download Total ( Speed = " & Format($AverageSpeed / 1024, "0,000") & " kB/s )"
End

Private Sub RenameFiles(Source As String)
 
    Dim sFilter, i As Integer
    Dim sFile, sPattern, sURL, sFilename, sLastSubFolder As String
    Dim aDir As String[]
   
    $aOriginalFilenames = New String[]
    aDir = New String[]
  
    For Each sURL In $aURL
      sLastSubFolder = Split(sUrl, "/").Last
      If String.InStr(sLastSubFolder, "?") <> 0 Or 
         String.InStr(sLastSubFolder, "=") <> 0 Or
         String.InStr(sLastSubFolder, ":") <> 0 Then          
         sFilename = Split(sLastSubFolder, "?,=,:", "", False, False).Last
         $aOriginalFilenames.Add(sFilename)
       Else
          $aOriginalFilenames.Add(sLastSubFolder)
       Endif   
    Next      
   
    sPattern = "*.tmp"
    sFilter = gb.File    
    i = 0
    For Each sFile In Dir(Source, sPattern, sFilter).Sort(0)
      Move Source &/ sFile To Source &/ $aOriginalFilenames[i]
      Inc i
    Next
  
End

Private Sub CopyDir(Source As String, Destination As String)
 
    Dim sFile, sPattern As String
    Dim sFilter As Integer
    Dim FileInfo As Stat
 
    sPattern = "*.*"
    sFilter = gb.File
     
    If Not Exist(Destination) Then Mkdir Destination
  
    For Each sFile In Dir(Source, sPattern, sFilter)    
      FileInfo = Stat(Source &/ sFile)   
'-- The content of the error text file (with the original extension) is 'Not Found' 
'-- if the download file was cannot be found. OR 'Bad request'
      If FileInfo.Size = 9 Then
         Message.Info("<b>The file " & sFile & " was not found!</b><hr>The content of the saved error text file (with the original extension) is 'Not Found', if the download file was cannot be found.")       
      Endif
'-- The content of the error text file (with the original extension) is 'Bad request' 
'-- if the download file was cannot be found.   
      If FileInfo.Size = 11 Then
         Message.Info("<b>The file " & sFile & " was not found!</b><hr>The content of the saved error text file (with the original extension) is 'Bad request', if the download file was cannot be found.")       
      Endif

      If Not Exist(Destination &/ sFile) Then           
         Copy Source &/ sFile To Destination &/ sFile   
      Endif
    Next
  
End

Private Sub Backup()
 
    Dim sSource, sDestination As String
    
    sSource = "/tmp/gambas." & System.User.Id &/ $TempDirectory
    sDestination = System.User.Home &/ "Downloads" &/ "DLD"   
      RenameFiles(sSource)
      CopyDir(sSource, sDestination)    
    Print "DONE!"
 
End

Private Function SetStatus(iStatus As Integer)
  
    Select iStatus
      Case Download.NotReady
        lblStatus.Text = "Download_NotReady"
      Case Download.Ready
        lblStatus.Text = "Download_Ready"
      Case Download.Downloading
        lblStatus.Text = "Download_Downloading"
      Case Download.Finish
        lblStatus.Text = "Download_Finish"
      Case Download.Error
        lblStatus.Text = "Download_Error"
    End Select
  
End
 
Public Sub Form_Close()
    hDownloadManager.Stop()
End

Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k24/k24.2/k24.2.7/start.txt · Zuletzt geändert: 24.08.2020 (Externe Bearbeitung)

Seiten-Werkzeuge