Aplikace pro demonstraci
Nejprve doporučuji si stáhnout přiložený demonstrační projekt, ten si budeme rozebírat. Projekt je »zde«.Začátek
Abychom si ověřili, co vlastně posíláme ven a co se nám vrací, je formulář poněkud větší a obsahuje tři RichTextBoxy, z nichž do jednoho se bude zapisovat vygenerovaný HTTP požadavek, do druhého vrácená hlavička odpovědi a ve třetím se zobrazí vlastní tělo zprávy (neboli
stažený soubor): 
Všechna ostatní pole na formuláři jsou pro nastavení parametrů, z kterých se bude generovat požadavek na
připojení a následně HTTP požadavek pro získání souboru. Prvně si nadeklarujeme pár proměnných, co budeme používat (naleznete je v deklaracích na formuláři):
'Kam se připojujeme
Private m_strRemoteHost As String
'Cílový host pokud jdeme přes proxy
Private m_strProxyHost As String
'relativní cesta k souboru, který chceme získat
Private m_strFilePath As String
'odpověď serveru
Private m_strHttpResponse As String
'Proměnná pro příznak odpovědi
Private m_bResponseReceived As Boolean
'proměnná pro příznak záhlaví
Private m_bHeaderReceived As Boolean
'Hodnota "Content-Length" HTTP hlavičky
Private m_lContentLength As Long
'Proměnná pro hodnotu, kolik už se stáhlo
Private m_lDownloadedBytes As Long
Tohle je jenom na okraj, abyste pak nebyli překvapení odkud se ty proměnné berou. Na události Form_Load je jen pár řádků pro vytvoření formuláře. Protože se budeme
připojovat k internetu i pomocí Proxy Serveru a můžeme tahat i chráněné zdroje, je nutné si napsat funkci, která bude provádět enkódování BASE64 (proč zrovna tohle jsem psal dříve). Tady ta funkce je: Private Function
Base64_Encode(strSource) As String
Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim strTempLine As String
Dim j As Integer
For j = 1 To (Len(strSource) - Len(strSource) Mod 3) Step 3
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 _
+ Asc(Mid(strSource, j + 2, 1)) \ 64) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 2, 1)) Mod 64) + 1, 1)
Next j
If Not (Len(strSource) Mod 3) = 0 Then
If (Len(strSource) Mod 3) = 2 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
+ Asc(Mid(strSource, j + 1, 1)) \ 16 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 + 1, 1)
strTempLine = strTempLine & "="
ElseIf (Len(strSource) Mod 3) = 1 Then
strTempLine = strTempLine + Mid(BASE64_TABLE, Asc(Mid(strSource, j, 1)) \ 4 + 1, 1)
strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 + 1, 1)
strTempLine = strTempLine & "=="
End If
End If
Base64_Encode = strTempLine
End Function |