Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка картинки по HTTP через прокси

22K
30 марта 2007 года
MaaXSeeR
6 / / 13.03.2007
Есть такая проблема.

Есть следующий код :


Код:
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://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

яШяа<и тут пошла картинка>

(немного урезанный ответ тут)

Из шапки выдерается длина картинки, и через FileStreamer пишется все, начиная с "яШяа", пока длина не станет больше указанной, лишнее обрезается.

Вроде бы все ничего, но вот картинки закачиваются правильно через раз.
Иногда не до конца дописывается в фаил, иногда все ок, а иногда вобще картинька бьется (вот так)


Что не так? Может кто подскажет ?
22K
03 апреля 2007 года
MaaXSeeR
6 / / 13.03.2007
Ладно, упростим вопрос....По HTTP (80 порт) надо загрузить фаил (в моем случае - картинку), используя прокси. Как правильно это осуществить?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог