Descargar un archivo utilizando un proxy con autentificación en VB.NET

Iniciado por bybaal, 12 Enero 2016, 22:29 PM

0 Miembros y 1 Visitante están viendo este tema.

bybaal

Hola a todos, he encontrado un tema muy viejo que habla sobre descargar un archivo de internet, pero no utilizaba un proxy con autentificación, que es lo que necesito y al ejemplo que se utilizó no se como combinarlo con lo que tengo, aquí les dejo ambos para ver si alguien me puede ayudar

Ejemplo del tema viejo

Código (vbnet) [Seleccionar]

My.Computer.Network.DownloadFile("https://foro.elhacker.net/Themes/converted/selogo.jpg", "c:\1.jpg"


Esto es lo que tengo y no se como combinarlos

Código (vbnet) [Seleccionar]

Dim proxy As New WebProxy("proxydeprueba.com:3128", False)
proxy.Credentials = New NetworkCredential("yomismo", "mipass,")


Gracias por los aportes que puedan dar

Eleкtro

Los métodos del namespace My son útiles y sencillos ...pero limitados, trata de evitarlos.

Teniendo el web-proxy:
Código (vbnet) [Seleccionar]
Dim proxy As New WebProxy("proxydeprueba", 3128)
proxy.Credentials = New NetworkCredential("yomismo", "mipass,")


Puedes utilizar la class webclient para descargar el archivo de forma sincrónica o asíncrona para utilizar sus eventos de reporte de progreso:
Código (vbnet) [Seleccionar]
Using wc As New WebClient
   wc.Proxy = proxy
   wc.DownloadFile("https://foro.elhacker.net/Themes/converted/selogo.jpg", "C:\selogo.jpg")
End Using


O también la class WebRequest / HttpWebRequest:
Código (vbnet) [Seleccionar]
Dim request As WebRequest = WebRequest.Create("https://foro.elhacker.net/Themes/converted/selogo.jpg")

With request
   .Proxy = proxy
End With

Using sr As Stream = (request.GetResponse.GetResponseStream)

   Using fs As FileStream = File.Create("c:\selogo.jpg")
       sr.CopyTo(fs)
   End Using

End Using

También puedes realizar una copia del stream por bloques si prefieres reportar el progreso de la copia en archivos grandes.




Código fuente sacado de mi API ElektroKit:


Como puedes ver, con el siguiente método se intenta evitar o automatizar la asignación de un nombre de archivo de destino, aunque no es un algoritmo perfecto.
El código original utiliza una lista de MimeTypes para una mejor detección del tipo o extensión del archivo de destino, pero la he eliminado para reducir el código que mostrarte aquí en el foro, y le añadí el parámetro del proxy.
Si descomentas las lineas de variables comentadas puedes extender el método para reportar el progreso mediante eventos.

Ejemplo de uso:
Código (vbnet) [Seleccionar]
DownloadFile(proxy, "http://download.thinkbroadband.com/5MB.zip", "C:\")

Snippet:
Código (vbnet) [Seleccionar]
Public Shared Sub DownloadFile(ByVal proxy As WebProxy,
                              ByVal url As String,
                              ByVal dirpath As String)

   Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
   req.Proxy = proxy

   Using resp As WebResponse = req.GetResponse

       Dim filename As String = ""

       Try
           filename = Path.GetFileName(resp.ResponseUri.AbsoluteUri)

       Catch ex As Exception
           filename = String.Format("{0}.{1}", Path.GetFileNameWithoutExtension(Path.GetRandomFileName), "file")

       Finally
           If Not Path.HasExtension(filename) Then
               filename.Insert(filename.Length, ".file")
           End If

       End Try

       Dim buffer As Byte() = New Byte(1023) {}
       Dim bytesRead As Integer
       ' Dim totalBytes As Long
       ' Dim receivedBytes As Long

       Using fs As New FileStream(Path.Combine(dirpath, filename), FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Read)

           Using data As Stream = resp.GetResponseStream

               ' totalBytes = data.Length
               bytesRead = data.Read(buffer, 0, buffer.Length)

               While (bytesRead > 0)
                   fs.Write(buffer, 0, bytesRead)
                   ' receivedBytes += bytesRead
                   bytesRead = data.Read(buffer, 0, buffer.Length)
               End While

           End Using

       End Using

   End Using

End Sub


Saludos!








bybaal

OK, muchas gracias, funciona perfectamente.

Cita de: Eleкtro en 13 Enero 2016, 09:55 AM
Los métodos del namespace My son útiles y sencillos ...pero limitados, trata de evitarlos.

Teniendo el web-proxy:
Código (vbnet) [Seleccionar]
Dim proxy As New WebProxy("proxydeprueba", 3128)
proxy.Credentials = New NetworkCredential("yomismo", "mipass,")


Puedes utilizar la class webclient para descargar el archivo de forma sincrónica o asíncrona para utilizar sus eventos de reporte de progreso:
Código (vbnet) [Seleccionar]
Using wc As New WebClient
   wc.Proxy = proxy
   wc.DownloadFile("https://foro.elhacker.net/Themes/converted/selogo.jpg", "C:\selogo.jpg")
End Using


O también la class WebRequest / HttpWebRequest:
Código (vbnet) [Seleccionar]
Dim request As WebRequest = WebRequest.Create("https://foro.elhacker.net/Themes/converted/selogo.jpg")

With request
   .Proxy = proxy
End With

Using sr As Stream = (request.GetResponse.GetResponseStream)

   Using fs As FileStream = File.Create("c:\selogo.jpg")
       sr.CopyTo(fs)
   End Using

End Using

También puedes realizar una copia del stream por bloques si prefieres reportar el progreso de la copia en archivos grandes.




Código fuente sacado de mi API ElektroKit:


Como puedes ver, con el siguiente método se intenta evitar o automatizar la asignación de un nombre de archivo de destino, aunque no es un algoritmo perfecto.
El código original utiliza una lista de MimeTypes para una mejor detección del tipo o extensión del archivo de destino, pero la he eliminado para reducir el código que mostrarte aquí en el foro, y le añadí el parámetro del proxy.
Si descomentas las lineas de variables comentadas puedes extender el método para reportar el progreso mediante eventos.

Ejemplo de uso:
Código (vbnet) [Seleccionar]
DownloadFile(proxy, "http://download.thinkbroadband.com/5MB.zip", "C:\")

Snippet:
Código (vbnet) [Seleccionar]
Public Shared Sub DownloadFile(ByVal proxy As WebProxy,
                              ByVal url As String,
                              ByVal dirpath As String)

   Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
   req.Proxy = proxy

   Using resp As WebResponse = req.GetResponse

       Dim filename As String = ""

       Try
           filename = Path.GetFileName(resp.ResponseUri.AbsoluteUri)

       Catch ex As Exception
           filename = String.Format("{0}.{1}", Path.GetFileNameWithoutExtension(Path.GetRandomFileName), "file")

       Finally
           If Not Path.HasExtension(filename) Then
               filename.Insert(filename.Length, ".file")
           End If

       End Try

       Dim buffer As Byte() = New Byte(1023) {}
       Dim bytesRead As Integer
       ' Dim totalBytes As Long
       ' Dim receivedBytes As Long

       Using fs As New FileStream(Path.Combine(dirpath, filename), FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Read)

           Using data As Stream = resp.GetResponseStream

               ' totalBytes = data.Length
               bytesRead = data.Read(buffer, 0, buffer.Length)

               While (bytesRead > 0)
                   fs.Write(buffer, 0, bytesRead)
                   ' receivedBytes += bytesRead
                   bytesRead = data.Read(buffer, 0, buffer.Length)
               End While

           End Using

       End Using

   End Using

End Sub


Saludos!