Zum vorherigen AbschnittZum nächsten Abschnitt Dateien aus dem Internet herunterladen
Für automatische Updates zu Programmen ist es unentbehrlich, Dateien aus dem Internet herunterladen zu können. Da Visual Basic leider keine gute Dokumentation für das Winsock-Control beigelegt ist, erfahren SIe nun hier, wie man mit Hilfe dieses Controls Dateien aus dem Internet herunterladen kann. Zusätzlich lässt sich sogar noch eine Fortschrittsleiste angeben, die den Fortschritt des Downloads anzeigt.
Ihre Bewertung:
 12345
    

Bewertung dieses Tipps:  (bewertet von insgesamt 68 Besuchern)

 Zum vorherigen AbschnittZum nächsten Abschnitt Die Routinen und Steuerelemente
Das Ganze ist etwas kompliziert, da hier nicht nur eine Funktion, sondern auch mehrere Eventhandler erforderlich sind. Die eigentlich aufzurufende Funktion ist DownloadFile, aber dazu lesen Sie im nächsten Abschnitt mehr. Falls Sie eine ältere Version als Visual Basic 6.0 im Einsatz haben, lesen Sie bitte vorher den Tipp "Replace auch in älteren VB-Versionen" und fügen Sie die dort genannnte Funktion noch ein.
Sie benötigen erstmal ein bzw. zwei Steuerelemente; das Winsock Control und eventuell - je nach Belieben - eine "ProgressBar" aus den Microsoft Windows Common Controls. Die Erklärung zu den farblich hervorgehobenen Elementen finden SIe wie immer weiter unten:

Private mblnIsHeader As Boolean
Private mstrReturnHeader As String
Private mstrRequestHeader As String
Private bolUseProgressBar As Boolean
Private objProgressBar As Object
 
Private Sub Winsock1_Connect()
   'Wenn Verbindung aufgebaut ist, Header senden
   Winsock1.SendData mstrRequestHeader
End Sub
 
Private Sub DownloadFile(URL As String, Destination As String, Optional ProgressBarToUse As Object)
   Dim strPureURL As String
   Dim strServerAddress As String
   Dim strServerHostIP As String
   Dim strDocumentURI As String
   Dim lngStartPos As Long
   Dim lngServerPort As Long
   
   'Prüfen, ob eine Fortschrittsleiste angegeben wurde
   If Not ProgressBarToUse Is Nothing Then
      bolUseProgressBar = True
      Set objProgressBar = ProgressBarToUse
   Else
      bolUseProgressBar = False
   End If
 
   'Header schreiben
   mstrRequestHeader = ""
   strRequestTemplate = "GET _$-$_$- HTTP/1.0" & Chr(13) & Chr(10) & _
                        "Accept: image/gif, image/x-xbitmap, image/jpeg, " & _
                        "image/pjpeg, application/vnd.ms-powerpoint, " & _
                        "application/vnd.ms-excel, application/msword, " & _
                        "application/x-comet, */*" & Chr(13) & Chr(10) & _
                        "Accept-Language: en" & Chr(13) & Chr(10) & _
                        "Accept-Encoding: gzip , deflate" & Chr(13) & Chr(10) & _
                        "Cache-Control: no-cache" & Chr(13) & Chr(10) & _
                        "Proxy-Connection: Keep-Alive" & Chr(13) & Chr(10) & _
                        "User-Agent: SSM Agent 1.0" & Chr(13) & Chr(10) & _
                        "Host: @$@@$@" & Chr(13) & Chr(10)
 
   '"http://" entfernen
  
strPureURL = Right(URL, Len(URL) - 7)
   lngStartPos = InStr(1, strPureURL, "/")
   If lngStartPos < 1 Then
     
strServerAddress = strPureURL
      strDocumentURI = "/"
   Else
     
strServerAddress = Left(strPureURL, lngStartPos - 1)
      strDocumentURI = Right(strPureURL, Len(strPureURL) - lngStartPos + 1)
   End If
  
   strServerHostIP = strServerAddress
   lngServerPort = 80
 
   'URL in Header einsetzen
  
mstrRequestHeader = strRequestTemplate
   mstrRequestHeader = Replace(mstrRequestHeader, "_$-$_$-", strDocumentURI)
  
   mstrRequestHeader = Replace(mstrRequestHeader, "@$@@$@", strServerAddress)
   mstrRequestHeader = mstrRequestHeader & Chr(13) & Chr(10)

   'Zieldatei zum binären Schreiben öffnen
   Open Destination For Binary Access Write As #1
   mblnIsHeader = True
   
   'Verbindung zum Server aufbauen
   Winsock1.Connect strServerHostIP, lngServerPort
End Sub
 
Private Sub Winsock1_Close()
   Winsock1.Close
 
   'Datei schließen
  
Close #1
End Sub
 
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
   'Wenn Daten empfangen werden
   Dim lngBytes As Long
   Dim blnFoundHeadEndByte As Boolean
   Dim b() As Byte
   Dim b2() As Byte
   Dim aryMyArray As Variant
   Dim i As Long
   Dim j As Long
   Dim strChr As String
   
   Winsock1.PeekData strTemp, vbString
   If (mblnIsHeader) Then
     
'Header empfangen
      Winsock1.GetData b(), vbByte, 350
      mstrReturnHeader = StrConv(b(), vbUnicode)
      For i = LBound(b) + 3 To UBound(b)
         If (blnFoundHeadEndByte) Then
           
b2(j) = b(i)
            j = j + 1
         Else
            If b(i - 3) = 13 And b(i - 2) = 10 And b(i - 1) = 13 And b(i) = 10 Then
              
ReDim b2(UBound(b) - i)
               If UBound(b2) > 0 Then ReDim b2(UBound(b2) - 1)
               blnFoundHeadEndByte = True
              
j = 0
            End If
         End If
      Next
i
 
      'Dateigröße aus Header auslesen
      strStart = InStr(1, mstrReturnHeader, "Content-Length: ") + Len("Content-Length: ")
      strEnd = InStr(strStart, mstrReturnHeader, Chr(13))
 
      'Eventuell das Maximum der Fortschrittsleiste auf die Dateiröße setzen
      If bolUseProgressBar Then objProgressBar.Max = Mid(mstrReturnHeader, strStart, strEnd - strStart)

      If (UBound(b2) > 0) Then
         If bolUseProgressBar Then objProgressBar.Value = objProgressBar.Value + UBound(b2) + 1
         Put #1, , b2()
      End If
      mblnIsHeader = False
   Else
      
Winsock1.GetData b, vbByte
 
      'Empfangene Daten in Datei schreiben
      Put #1, , b()
 
      'Eventuell Fortschrittsleiste aktualisieren
      If bolUseProgressBar Then objProgressBar.Value = objProgressBar.Value + UBound(b) + 1
   End If
End Sub


Winsock1 =
Falls Sie den Namen des Winsock-Steuerelements ändern möchten, der standardmäßig in diesen Prozeduren als "Winsock1" angesprochen wird, müssen Sie auch diese Elemente an den Namen anpassen, damit alles weiterhin korrekt funktioniert.

 Zum vorherigen AbschnittZum nächsten Abschnitt Aufruf
Der Aufruf der Funktion ist schon fast selbsterklärend:

DownloadFile "http://www.SHADOWare.de/files/programs/filesplit.zip", "C:\Programme\File Splitter 2.02.zip", ProgressBar1

Mit diesem Aufruf würde die Datei "filesplit.exe" (Der SHADOWare File Splitter 2.02) heruntergeladen und als "File Splitter 2.02.zip" im Verzeichnis "Programme" gespeichert werden. Zusätzlich wurde noch der Name eines ProgressBar-Steuerelements angegeben, weshalb wärend des Downloads eine Fortschrittsleiste zu sehen sein wird. Dieser letzte Parameter kann aber auch weggelassen werden, dann wird keine Fortschrittsleiste verwendet. Beachten Sie, das der Name der Fortschrittsleiste nicht in Anführungszeichen stehen darf.
Bitte haben Sie etwas Geduld, denn auch wenn eine Fortschrittsleiste angegeben wurde, sieht man in ihr nur den Fortschritt des Downloads. Das heißt, die Zeit, die das Programm benötigt, um den Server zu kontaktieren, wird nicht angezeigt und ist unbekannt. Und das kann auch schon mal bis zu einer Minute dauern. Sie merken, dass der Server geantwortet hat, wenn das erste mal der Event "Winsock1_DataArrival" eintritt, also der Header empfangen wird.

 Zum vorherigen AbschnittZum nächsten Abschnitt Projektdownload
Sie können sich ein Beispiel sowohl für Vb6, als auch für ältere Versionen mit Unterstützung für die Replace-Funktion herunterladen:
 Visual Basic 6.0  Visual Basic 5.0 und älter



Quellen: SHADOWare.de
©2000 by SHADOWare, Thomas Bachem