Jag försöker ladda ner en exe-fil med Inet-kontrollen, men det går inte så bra. Du kan ju alltid använda winsock... bara att skicka en http-header Jag har använt winsock först men det är inte alltid det fungerar. Hmm... nu ser jag iofs att din winsock-kod skiljer sig lite från min... ska ta och testa den... Jag har ett litet problem... hur får jag bort dom dubbla radbrytningarna och allt före när datan ligger i en array? De flesta servrar skickar headern i ett eget paket. Här är en kortare version med string istället för byte-arrayLadda ner binära filer med Inet-kontrollen
Det hade varit lätt om jag hade kunnat använda:
BArray() = Inet1.OpenURL(URL, icByteArray)
men jag måste skicka med en Referer-URL, så det går inte med OpenURL.
Nått tips på hur jag kan lösa det?
ThomasSv: Ladda ner binära filer med Inet-kontrollen
<code>
GET /sokvag/till_filen.exe HTTP/1.1
Host: www.dinsajt.com
Referer: http://vars.du.com/ifran.html
</code>
^--- dubbla radbrytningar i slutet
Sen tror jag inte de använder nån speciell kodnings-metod på binärfiler. Eventuellt gz-komprimering, men jag har själv aldrig sett det på nån server.
Först svarar servern med en egen header:
<code>
HTTP/1.1 200 OK
Server: Namnetpaservern 3.4.34.432
Enmassa: Andra headers
</code>
^-- dubbla radbrytningar igen, direkt följt av binärdatan.
Det är bara att skriva all data till filen allt eftersom det anländer med Winsock1_DataArrival-händelsen.
<code>
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Data() As Byte
Winsock1.GetData Data(), vbByte + vbArray
Put #1, , Data()
End Sub
</code>
Du får modifiera koden lite för att kompensera för headern i början.Sv: Ladda ner binära filer med Inet-kontrollen
Ibland får jag med konstiga tecken... ser ut som hex-tal, typ "5f0".
Då tänkte jag vara bekväm och gå runt problemet med Inet-kontrollen, men det blev tydligen inte så mycket lättare.
ThomasSv: Ladda ner binära filer med Inet-kontrollen
ThomasSv: Ladda ner binära filer med Inet-kontrollen
ThomasSv: Ladda ner binära filer med Inet-kontrollen
Skulle kunna tänka mig det så här:
<code>
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Static HeaderComplete As Boolean
Dim Data() As Byte
Winsock1.GetData Data(), vbByte + vbArray
If HeaderComplete Then
Put #1, , Data()
Else
HeaderComplete = True
End If
End Sub
</code>
Fast det är nog att "fuska" lite.
En annan metod kan fungera så här:
<code>
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Static HeaderComplete As Boolean 'Static gör att variablen behåller sitt värde mellan anropen
Dim Data() As Byte
Winsock1.GetData Data(), vbByte + vbArray 'Hämta datan
If HeaderComplete Then 'Servern har redan skickat headern
Put #1, , Data() 'Skriv resterande data till filen
ElseIf Data(0) <> Asc("H") Then 'Första raden i headern börjar alltid med HTTP/1
'Inet sparar även datan om den inte innehåller en header
HeaderComplete = True
Put #1, , Data()
Else
For i = 0 To bytesTotal - 1 'Eftersom det är en byteArray så är det inte så praktiskt att använda InStr
If Data(i) = 13 Then 'Första tecknet i en radbrytning (CR(13) + LF(10))
If j = 0 Or j = 2 Then
j = j + 1 'j håller reda på hur många tecken som stämmer med CR+LF+CR+LF (2 radbrytningar)
Else 'Den hittade ett CR på felaktig position
j = 0 'nollställ j
End If
ElseIf Data(i) = 10 Then 'LF
If j = 1 Or j = 3 Then
j = j + 1
Else
j = 0
Else 'Hittade ett tecken förutom CR/LF
j = 0
End If
If j = 4 Then 'i står nu på sista tecknet i CRLF+CRLF
If i < bytesTotal - 1 Then 'Det finns data efter CRLF+CRLF
HeaderComplete = True
For k = 0 To bytesTotal - i - 1 'Flytta fram all data efter i till början av arrayn
Data(k) = Data(i + k)
Next k
ReDim Preserve Data(bytesTotal - i) 'Klipp bort de sista byte'en
Put #1, , Data()
End If
End If
Next i
End If
End Sub
</code>
Det går nog att förenkla koden på vissa ställen... jag har inte heller testkört koden, så det kan finnas en del fel.Sv: Ladda ner binära filer med Inet-kontrollen
<code>
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim buffer As String, i As Integer
Winsock1.GetData buffer, vbString
If HeaderDone Then
Data = Data & buffer
Else
i = InStr(1, buffer, vbCrLf & vbCrLf)
If i > 0 Then
buffer = buffer & Mid(Data, i + 4)
HeaderDone = True
End If
End If
End Sub
</code>