If txtFinish.Text <> "" Then
Dim filenum As Integer = FreeFile()
Dim sleep As Integer = 100
If txtSleepThr.Text <> "" And IsNumeric(txtSleepThr.Text) Then
If CInt(txtSleepThr.Text) < 5000 Then sleep = CInt(txtSleepThr.Text)
End If
Dim urls() As String = Split(txtFinish.Text, vbCrLf)
stattext = "Файлов " & UBound(urls) + 1
lblstata.Invoke(New MethodInvoker(AddressOf fTextFile_synck))
Dim proxyip As String = CStr(txtProxyIP.Text)
Dim summdata As Long
Dim proxyport As Integer = CInt(txtProxyPort.Text)
Dim finishfiles As Integer = 0
For i As Integer = 0 To UBound(urls)
filenum = FreeFile()
Dim path As String = Mid(urls(i), InStr(8, urls(i), "/"), urls(i).Length - InStr(8, urls(i), "/") + 1)
FileOpen(filenum, folder & Mid(path, InStrRev(path, "/") + 1, path.Length - InStrRev(path, "/") + 1), OpenMode.Output, OpenAccess.Write, OpenShare.Shared)
Print(filenum, "null")
FileClose(filenum)
Next
For i As Integer = 0 To UBound(urls)
If BackgroundWorker1.CancellationPending Then Exit Sub
Try
Dim tcpClient As New System.Net.Sockets.TcpClient
Dim server As String = Mid(urls(i), 8, InStr(8, urls(i), "/") - 8)
Dim path As String = Mid(urls(i), InStr(8, urls(i), "/"), urls(i).Length - InStr(8, urls(i), "/") + 1)
Dim data() As Byte
If chbProxy.Checked Then
data = System.Text.Encoding.Default.GetBytes( _
"GET " & urls(i) & " HTTP/1.1" & vbCrLf _
& "Accept(-Language) : ru()" & vbCrLf _
& "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-icq, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*" _
& "UA(-CPU) : x86()" & vbCrLf _
& "Accept(-Encoding) : gzip, deflate" & vbCrLf _
& "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.2)" & vbCrLf _
& "Host: " & server & vbCrLf & vbCrLf)
tcpClient.Client.Connect(proxyip, proxyport)
Else
data = System.Text.Encoding.Default.GetBytes( _
"GET " & path & " HTTP/1.1" & vbCrLf _
& "Accept(-Language) : ru()" & vbCrLf _
& "UA(-CPU) : x86()" & vbCrLf _
& "Accept(-Encoding) : gzip, deflate" & vbCrLf _
& "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.2)" & vbCrLf _
& "Host: " & server & vbCrLf & vbCrLf)
tcpClient.Client.Connect(server, 80)
End If
Dim stream As Net.Sockets.NetworkStream = tcpClient.GetStream
'''''''tcpClient.Client.Send(data, data.Length, Net.Sockets.SocketFlags.None)
stream.Write(data, 0, data.Length)
Dim recivebyte(1000) As Byte
Dim recivedata As String = ""
Dim Lenght As Integer = 0
Dim filename As String = folder & Mid(path, InStrRev(path, "/") + 1, path.Length - InStrRev(path, "/") + 1)
Dim complet As Boolean = False
Dim fs As System.IO.FileStream = New System.IO.FileStream(folder & Mid(path, InStrRev(path, "/") + 1, path.Length - InStrRev(path, "/") + 1), IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.ReadWrite, 1000, IO.FileOptions.Asynchronous)
fs.Flush()
Dim offset As Integer = 0
Dim datale As Long = 0
Dim len As Integer = 0
complet = False
Do
Try
Array.Clear(recivebyte, 0, 1001)
System.Threading.Thread.Sleep(sleep)
stream.Read(recivebyte, 0, recivebyte.Length)
If recivebyte(0) = 0 And recivebyte(1) = 0 And recivebyte(2) = 0 And recivebyte(3) = 0 Then
Exit Do
End If
offset = 0
If Not complet Then
For j As Integer = 0 To UBound(recivebyte) - 1
If recivebyte(j) = 13 And recivebyte(j + 1) = 10 And recivebyte(j + 2) = 13 And recivebyte(j + 3) = 10 Then
offset = j + 4
complet = True
Exit For
End If
Next j
End If
Dim recivedatatemp As String = System.Text.Encoding.Default.GetString(recivebyte)
If InStr(recivedatatemp, "Content-Length:") <> 0 Then
Lenght = Mid(recivedatatemp, InStr(recivedatatemp, "Content-Length:") + 16, InStr(InStr(recivedatatemp, "Content-Length:") + 1, recivedatatemp, vbCrLf) - InStr(recivedatatemp, "Content-Length:") - 16)
End If
fs.Flush()
fs.Write(recivebyte, offset, recivebyte.Length - offset)
System.Threading.Thread.Sleep(10)
datale += UBound(recivebyte) - offset
summdata += UBound(recivebyte) - offset
stattext = "Файлов " & UBound(urls) + 1 & "; Загружено " & finishfiles & "; Текущий " & FormatLenght(datale) & "; Всего " & FormatLenght(summdata)
lblstata.Invoke(New MethodInvoker(AddressOf fTextFile_synck))
Catch ex As Exception
End Try
Array.Clear(recivebyte, 0, 1001)
Loop While fs.Length < Lenght
fs.SetLength(Lenght)
datale = 0
finishfiles += 1
stattext = "Файлов " & UBound(urls) + 1 & "; Загружено " & finishfiles & "; Текущий " & FormatLenght(datale) & "; Всего " & FormatLenght(summdata)
lblstata.Invoke(New MethodInvoker(AddressOf fTextFile_synck))
fs.Close()
stream.Close()
tcpClient.Close()
Catch ex As Exception
End Try
Next
End If
Загрузка картинки по HTTP через прокси
Есть следующий код :
Код:
(жирным выделен код загрузки и записи картинки в фаил)
Здесь берется список ссылок.
Допустим нужно загрузить картинку http://vanix.net/images/uploads2/met-art_af_495_0117.jpg
Посылается запрос, приходит ответ вида :
Код:
HTTP/1.0 200 OK
Server: nginx/0.5.14
Date: Fri, 30 Mar 2007 17:35:19 GMT
Content-Type: image/jpeg
Content-Length: 21542
Last-Modified: Thu, 29 Mar 2007 11:02:45 GMT
Expires: Sun, 29 Apr 2007 17:35:19 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
Age: 4822
X-Cache: HIT from proxy.kanal7.ru
Via: 1.0 proxy.kanal7.ru:8080 (squid/2.6.STABLE9)
Proxy-Connection: keep-alive
яШяа<и тут пошла картинка>
Server: nginx/0.5.14
Date: Fri, 30 Mar 2007 17:35:19 GMT
Content-Type: image/jpeg
Content-Length: 21542
Last-Modified: Thu, 29 Mar 2007 11:02:45 GMT
Expires: Sun, 29 Apr 2007 17:35:19 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes
Age: 4822
X-Cache: HIT from proxy.kanal7.ru
Via: 1.0 proxy.kanal7.ru:8080 (squid/2.6.STABLE9)
Proxy-Connection: keep-alive
яШяа<и тут пошла картинка>
(немного урезанный ответ тут)
Из шапки выдерается длина картинки, и через FileStreamer пишется все, начиная с "яШяа", пока длина не станет больше указанной, лишнее обрезается.
Вроде бы все ничего, но вот картинки закачиваются правильно через раз.
Иногда не до конца дописывается в фаил, иногда все ок, а иногда вобще картинька бьется (вот так)
Что не так? Может кто подскажет ?
Ладно, упростим вопрос....По HTTP (80 порт) надо загрузить фаил (в моем случае - картинку), используя прокси. Как правильно это осуществить?