FTP upload con vb.net – FtpWebRequest

Si bien vb.net ya trae una clase de ftp para uso simple aveces no es lo suficientemente poderosa o no alcanza nuestros requerimientos para lo que deseamos hacer.

Muchas veces se desea tener una barra de progreso para conocer cuanto le queda a nuestra descarga o subida para terminar y es algo complicado para el usuario no experimentado. Más allá de eso vb.net permite de forma sencilla mostrar el progreso de nuestras subidas habilitando la interfaz ui del método UploadFile.

My.Computer.Network.UploadFile("C:\readme.txt", "ftp://ftp.server.com",New NetworkCredential(Username, Password), true)

Como se puede observar el cuarto argumento del método corresponde a habilitar o no la interfaz de carga donde se muestra el nombre de archivo que se esta subiendo, una barra de progreso y el botón cancelar. Lamentablemente no se puede tener acceso a esos controles para modificarlos y obtener información de ellos por lo que estamos muy limitados.

Con FtpWebRequest las cosas se puede hacer un poco más “modulares” dado que tenemos total control sobre lo que enviamos y de la forma en la que lo enviamos, pero también las cosas se pueden complicar un poco.

Dim request As FtpWebRequest = WebRequest.Create(New Uri("ftp://ftp.server.com/readme.txt"))
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential("username", "password")

Lo primero que hacemos es iniciar la clase y crear un request a la url provista. Si bien puede ser un string simple siempre es recomendado pasar un uri para asegurarnos que es valido si es que un usuario lo ah introducido manualmente.

Note que la url contiene el nombre de archivo que se va a subir, de esta manera se le indica al servidor sobre que archivo deseamos trabajar.

Por ultimo se indica el método de conexión y las credenciales que albergan el nombre de usuario y la contraseña para conectarse.

Dim fileStream() As Byte = System.IO.File.ReadAllBytes("C:\readme.txt")

Dim requestStream As System.IO.Stream = request.GetRequestStream()
requestStream.Write(fileStream, 0, fileStream.Length)

Una vez conectados lo que necesitamos es leer todos los bytes del archivo que deseamos subir y enviarlos a través del stream de transmisión.

Enviar los archivos de esta manera en vez de usando el método UploadFile de la clase Network nos permite poder controlar la subida de forma mas eficiente y así en un futuro enviar los datos en paquetes de bytes para medir el progreso e inclusive la velocidad de transmisión y tiempo estimado de subida.

requestStream.Close()
requestStream.Dispose()

Y finalmente le decimos al garbage collector que ya no usaremos el stream de datos y liberamos la memoria utilizada.

Nuestro código final queda así:

Dim request As FtpWebRequest = WebRequest.Create(New Uri("ftp://ftp.server.com/readme.txt"))
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential("username", "password")

Dim fileStream() As Byte = System.IO.File.ReadAllBytes("C:\readme.txt")

Dim requestStream As System.IO.Stream = request.GetRequestStream()
requestStream.Write(fileStream, 0, fileStream.Length)

requestStream.Close()
requestStream.Dispose()

You may also like...

5 Responses

  1. Frank says:

    Gracias por esta info!

    Estuve tratando de hacer que un progressbar muestre como va la subida.

    Podrías darme una mano?

    • Pablo Cornehl says:

      Tengo pensado en escribir otro post de como realizar eso.

      Estate atento!
      Saludos.-

  2. Emmanuel says:

    Muchas gracias!
    Podrias ayudarme a hacer un progressbar que muestre como va la subida?

    Saludos!

    • Pablo Cornehl says:

      Oh es bastante sencillo. Tenes que hacer un bucle en el cual recorres los bytes del archivo. Fijate que con fileStream.Length sacas el total de bytes por lo que ya sabes hasta donde tiene que llegar el while.
      El resto es simplemente usar el requestStream.Write dentro del bucle ara enviar los paquetes donde el indice 0 pasa a ser el incremental del bucle. Y con el mismo incremental sacas el porcentage para asi saber cuanto va de progreso tambien podes usar eventos si queres para ir indicando a la aplicacion cuanto subio asi no colgas la UI.

  3. jorge says:

    me gustaria me orientaran para poder subir archivos a mediafire, mega o deposfiles cualquiera q funcione de preferencia mediafire

Leave a Reply

Your email address will not be published. Required fields are marked *