Los métodos del namespace
My son útiles y sencillos ...pero limitados, trata de evitarlos.
Teniendo el web-proxy:
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:
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:
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:
DownloadFile(proxy, "http://download.thinkbroadband.com/5MB.zip", "C:\")
Snippet:
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!