

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.
| |
| Bewertung dieses Tipps: |      | (bewertet von insgesamt 68 Besuchern) |

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.
|

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.

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: