Hi @ all!
Ich habe mir ein Steuerelement gebastelt, mit dem ich Dateien aus dem Web runterladen kann (über Http). Das funktioniert aber aus mir unerklärlichen Gründen nicht bei allen Dateien/Servern. Das Problem ist, dass ich teilweise Videodateien runterlade, diese dann aber nicht abgespielt werden können. Wenn ich sie manuell von der Seite runterlade, kann ich die Videodatei abspielen (was ein Fehlen des Codecs ausschließt). Wenn ich die Dateien auf Größe vergleiche, fällt mir auf, dass die von meiner OCX - runtergeladenen Datei eine minimal andere Anzahl an Bytes hat, als die lauffähige Datei.
Hier mal ein Fragment meines Codes:
Private Sub WSock_DataArrival(ByVal BytesTotal As Long)
Dim GotData as String, F As Integer, TimeLeft As Long
WSock.GetData GotData
'Header abfangen?
If DItem.ServerInfo Is Nothing Then
Set DItem.ServerInfo = ResponseHeader(GotData)
If DItem.ServerInfo Is Nothing Then
WSock_Error 1, "Unbekanntes Headerformat", 0, DItem.Source, "", 0, True
Exit Sub 'Es wurde kein Header runtergeladen
End If
DItem.BytesDown = DItem.ServerInfo.BytesDown 'falls resumed wurde
RaiseEvent GotHeader(DItem.ServerInfo) 'Event auslösen
If DItem Is Nothing Then Exit Sub 'Kann vorkommen, wenn innerhalb des
' GotHeader - Ereignisses der Download beendet wurde
If CancelAttempt Then Exit Sub 'Wegen Serverantwort Versuch abbrechen?
If GotData = "" Then Exit Sub 'Es wurde nur der Header ausgewertet
End If
DItem.BytesDown = DItem.BytesDown + BytesTotal
'Daten in Datei speichern
If DItem.Aim = "" Then
If LCase(DItem.ServerInfo.FileDesc) <> "text" Then
WSock_Error 1, "No text file", 0, DItem.Source, "", 0, False
Exit Sub
End If
'Daten in String speichern
DItem.Text = DItem.Text & GotData
Else
'Daten auf der Festplatte speichern
F = FreeFile
Open DItem.Aim For Binary Lock Read Write As #F
Put #F, DItem.BytesDown - BytesTotal + 1, GotData
Close #F
End If
'Für die DownloadRate
TimeLeft = (Timer - DItem.ServerInfo.StartTime)
If TimeLeft = 0 Then TimeLeft = 1
RaiseEvent Progress(DItem.BytesDown, DItem.ServerInfo.BytesTotal, ( _
DItem.BytesDown - DItem.ServerInfo.BytesDown) / TimeLeft, BytesTotal)
End Sub Der Code vor dem Speichern der Daten in eine Datei ist um den Header vom Server auszuwerten. Ich bin mir nicht sicher, aber eine mögliche Fehlerquelle könnte sein, dass die Variable GotData ein String ist. Möglicherweise werden die Daten aber vom Server nicht mit dem ASCII - Format sondern Byteweise gesendent, was dann zu falscher Konvertierung in String führt?! (Hab keinen Plan)
Bin mit meinem Latein leider am Ende. Würde mich echt riesig freuen, wenn mir jemand weiterhelfen könnte.
Gruß,
Chris |