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>