Para subir un archivo usando el protocolo FTP desde una aplicación ASP.NET 2, utiliza la clase FtpWebRequest.

No olvides importar System.IO y System.Net al inicio de tu código:

  1. Imports System.Net
  2. Imports System.IO

Este es el código para subir el archivo:

  1. 'Subir Archivo por FTP
  2. ' Configurar el Request
  3. Dim ElRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://servidorejemplo.com/folder1/archivo.zip"), FtpWebRequest)
  4. ElRequest.Credentials = New NetworkCredential("usuario", "password")
  5. ElRequest.Method = WebRequestMethods.Ftp.UploadFile
  6.  
  7. ' Leer archivo
  8. Dim BufferArchivo() As Byte = File.ReadAllBytes("D:Inetpubwwwrootarchivo.zip")
  9.  
  10. ' Subir archivo
  11. Dim ElStream As System.IO.Stream = ElRequest.GetRequestStream()
  12. ElStream.Write(BufferArchivo, 0, BufferArchivo.Length)
  13. ElStream.Close()
  14. ElStream.Dispose()

Solamente tienes que utilizar tus datos reales para la ruta del ftp, ruta local, nombre de usuario y contraseña.

Nota:
Si te sale este error:

Unable to cast object of type 'System.Net.FileWebRequest' to type 'System.Net.FtpWebRequest'

Quiere decir que estás haciendo algo similar a esto:

DirectCast(WebRequest.Create("c:\folder1\archivo.zip")

Escribe la ruta usando ftp:// en vez de c: y se solucionará el error antes mencionado.

17 comentarios sobre “Cómo subir un archivo por FTP usando ASP.NET 2

  1. He llegado a tu web por Google porque explicas exactamente lo que busco!!

    Hago exactamente lo que dices pero me da un error: tecopio codigo y error, a ver si me ayudas…

     Dim ElRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://ftp.miscursosgratuitos.com/pruebas/cursogratuito.aspx"), FtpWebRequest)
            ElRequest.Credentials = New NetworkCredential("xxx", "xxx")
            ElRequest.Method = WebRequestMethods.Ftp.UploadFile
            ' Leer archivo
            Dim BufferArchivo() As Byte = File.ReadAllBytes("D:Documents and SettingsJaviEscritoriocursogratuito.aspx")
            ' Subir archivo
            Dim ElStream As System.IO.Stream = ElRequest.GetRequestStream()
            ElStream.Write(BufferArchivo, 0, BufferArchivo.Length)
            ElStream.Close()
            ElStream.Dispose()
    

    (donde las xxx son las que uso para subir via ftp archivos, p.e via VWD…)

    EL ERROR QUE ME DA**************

    El código de usuario no controló System.Net.WebException
      Message="Error en el servidor remoto: (530) No ha iniciado sesión."
      Source="System"
      StackTrace:
           en System.Net.FtpWebRequest.CheckError()
           en System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
           en System.Net.FtpWebRequest.RequestCallback(Object obj)
           en System.Net.CommandStream.InvokeRequestCallback(Object obj)
           en System.Net.CommandStream.Abort(Exception e)
           en System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
           en System.Net.FtpWebRequest.GetRequestStream()
           en listarftp.Page_Load(Object sender, EventArgs e) en D:Documents and SettingsJaviMis documentosVisual Studio 200522102008-subir.arx.serverlistarftp.aspx.vb:línea 47
           en System.Web.UI.Control.OnLoad(EventArgs e)
           en System.Web.UI.Control.LoadRecursive()
           en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    

    SI ME PUEDIERAIS AYUDAR SUUUUPERAGRADECIDO!!!

    Saludos, Javier.-

  2. PEEEEEEEEEEEEERDOOOOOOOOOOOOOOOON

    Ese error me da pk puse las xxx y claro, imposible conectar….

    el error es este:

    El código de usuario no controló System.Net.WebException
      Message="Error en el servidor remoto: (550) Archivo no disponible (ej. no se encuentra el archivo o no se tiene acceso)."
      Source="System"
      StackTrace:
           en System.Net.FtpWebRequest.CheckError()
           en System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
           en System.Net.FtpWebRequest.RequestCallback(Object obj)
           en System.Net.CommandStream.InvokeRequestCallback(Object obj)
           en System.Net.CommandStream.Abort(Exception e)
           en System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
           en System.Net.FtpWebRequest.GetRequestStream()
           en listarftp.Page_Load(Object sender, EventArgs e) en D:Documents and SettingsJaviMis documentosVisual Studio 200522102008-subir.arx.serverlistarftp.aspx.vb:línea 47
           en System.Web.UI.Control.OnLoad(EventArgs e)
           en System.Web.UI.Control.LoadRecursive()
           en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    
  3. O no existe el archivo:
    D:Documents and SettingsJaviEscritoriocursogratuito.aspx

    O en tu FTP no existe la ruta:
    ftp://ftp.miscursosgratuitos.com/pruebas/

    De cualquier forma, si me dices cuál es la línea 47 en tu archivo listarftp.aspx.vb nos ayudarías mucho a ver qué pasa.

    Por el error que marca, me late que es tu FTP, checa que el usuario que estás usando tiene como directorio predeterminado el raíz, porque estás especificando /pruebas.

    Si el usuario, al conectarse, es redirigido a pruebas entonces el directorio que estás especificando no va a funcionar.

    Si todo falla, prueba con otro ftp, me late que por ahí está tu problemita.

  4. QUEEEEEEE VELOCIDAD!!!!

    Muchas gracias por la ayuda, se agradece…

    Vamos a ver si me puedes ayudar…
    ** el archivo a subir existe
    ** user y pass estan tambien bien (los uso para subir con el VWD)
    ** quizas sea en la web donde este el problema…

    La web tiene una direccion que he creado que es
    http://www.miscursosgratuitos.com/pruebas/cursogratuito.aspx

    Entiendo que le puedo meter a la carpaeta pruebas lo que quiera… y por eso le quiero enchufar el archivo txt que le paso al hacer el load…

    mi linea 47 es:

    Dim ElStream As System.IO.Stream = ElRequest.GetRequestStream()
    

    y es ahi donde me da el error…

  5. Bueeeeno, algo parece que ha cambiado….

    con este codigo

    Dim ElRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://miscursosgratuitos.com/httpdocs/"), FtpWebRequest)
            
            ElRequest.Credentials = New NetworkCredential("xxx", "xxx")
            ElRequest.Method = WebRequestMethods.Ftp.UploadFile
            ' Leer archivo
            Dim BufferArchivo() As Byte = File.ReadAllBytes("D:Documents and SettingsJaviEscritoriocc.html")
            ' Subir archivo
    
            Dim ElStream As System.IO.Stream = ElRequest.GetRequestStream()
            ElStream.Write(BufferArchivo, 0, BufferArchivo.Length)
            ElStream.Close()
            ElStream.Dispose()
    

    AHORA DA OTRO ERROR:

    El código de usuario no controló System.Net.WebException
      Message="El URI solicitado no es válido para este comando FTP."
      Source="System"
      StackTrace:
           en System.Net.FtpWebRequest.CheckError()
           en System.Net.FtpWebRequest.GetRequestStream()
           en listarftp.Page_Load(Object sender, EventArgs e) en D:Documents and SettingsJaviMis documentosVisual Studio 200522102008-subir.arx.serverlistarftp.aspx.vb:línea 49
           en System.Web.UI.Control.OnLoad(EventArgs e)
           en System.Web.UI.Control.LoadRecursive()
           en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    

    EL DIRECTORIO RAIZ DEL FTP ES HTTPDOCS, POR ESO EL CAMBIO…
    CAMBIE TAMBIEN EL ARCHIVO A SUBIR POR UN HTML, POR SI ESO INFLUIA EN ALGO…

    AGRADEZCO MUCHIIIIISIMO TU AYUDA!!!!

  6. Intenta subir un zip sólo por si las dudas. O un jpg. Intenta en un ftp windows sí tienes acceso a uno.

    La Clase que estas usando viene con asp.net y es muy limitada.

    Sí todo falla busca en google por un componente de ftp para asp net.

    Yo he usado http://rebex.net y me ha salido muy bueno porque además te deja hacer otras cosas como crear subdirectorios etc.

    Claro que vas a tener que desembolsar un dinero pero prueba el trial oye busca alguno más.

    Sí piensas que no gas a requerir mayor funcionalidad que subir archivos al mismo directorio entonces tratale un rato más a tu código.

    Nos cuentas como te va.

  7. Gracias por tu respuesta

    AL FINAL SAN GOOGLE HIZO EL MILAGRO: busque un poco y encontre algo que me funciono… te paso el codigo para que le eches un ojo y por si lo quieres usar (esta en c# y no lo entiendo muy bien, pero me funciona…

    PRIMERO LA CLESE Y LUEGO SE INVOCA AL LOAD LA PAGE

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using  System.IO;
    using  System.Net;
    using  System.Text;
    
    
    public partial class C__ : System.Web.UI.Page
    {
    
        public void UploadFTP(string FilePath, string RemotePath, string Login, string Password)
    
    {
    
        using (FileStream fs = new FileStream(FilePath,FileMode.Open,FileAccess.Read,FileShare.Read))
    
        {
    
            string url = Path.Combine(RemotePath, Path.GetFileName(FilePath));
    
     
    
            // Creo el objeto ftp
    
            FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(url);
    
     
    
            // Fijo las credenciales, usuario y contraseña
    
            ftp.Credentials = new NetworkCredential(Login, Password);
    
     
    
            // Le digo que no mantenga la conexión activa al terminar.
    
            ftp.KeepAlive = false;
    
     
    
            // Indicamos que la operación es subir un archivo...
    
            ftp.Method = WebRequestMethods.Ftp.UploadFile;
    
     
    
            // … en modo binario … (podria ser como ASCII)
    
            ftp.UseBinary = true;
    
     
    
            // Indicamos la longitud total de lo que vamos a enviar.
    
            ftp.ContentLength = fs.Length;
    
     
    
            // Desactivo cualquier posible proxy http.
    
            // Ojo pues de saltar este paso podría usar 
    
            // un proxy configurado en iexplorer
    
            ftp.Proxy = null;
    
     
    
            // Pongo el stream al inicio
    
            fs.Position = 0;
    
     
    
            // Configuro el buffer a 2 KBytes
    
            int buffLength = 2048;
    
            byte[] buff = new byte[buffLength];
    
     
    
            int contentLen;
    
     
    
            // obtener el stream del socket sobre el que se va a escribir.
    
            using (Stream strm = ftp.GetRequestStream())
    
            {
    
                // Leer del buffer 2kb cada vez
    
                contentLen = fs.Read(buff, 0, buffLength);
    
     
    
                // mientras haya datos en el buffer ….
    
                while (contentLen != 0)
    
                {
    
                    // escribir en el stream de conexión
    
                    //el contenido del stream del fichero
    
                    strm.Write(buff, 0, contentLen);
    
                    contentLen = fs.Read(buff, 0, buffLength);
    
                }
    
            }
    
        }
    
    }
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
            //UploadFTP(@"D:Documents and SettingsJaviEscritoriocc.html", "ftp://ftp.miscursosgratuitos.com", "user", "pass");
            UploadFTP(@"D:Documents and SettingsJaviEscritoriocursos_gratuitos_gestion_conocimiento.aspx", "ftp://ftp.miscursosgratuitos.com", "user", "pass");
    
        }
    }
    
  8. Hola,
    muy bueno el Script, pero tengo un problema. Lo tengo dentro de un for que me sube varios archivos de distintos tamaños y cuando llega a un archivo de unos 6 mg no puede con el y da un error en el comando (imagino q en el write)
    Alguien ha logrado subir archivos de gran capacidad mediante algun script????
    Es muy necesario para poder mecanizar el proceso.

    Muchas Gracias de antemano

  9. Hola susana, revisa un post que puse más arriba sobre Rebex. Intenta con ese. Claro, va a costar, pero depende de tu proyecto quizás valga la pena.

    Yo puse Rebex porque lo use en un proyecto y no tuve ningún problema, pero pon en Google “ASP.NET FTP Component” y seguramente te salen varias opciones.

    Saludos.

  10. Hola Pablo,

    Gracias por tu respuesta pero no me vale, intentaba solo quitarme trabajo, ya que en mi empresa no pagaran por algo así. Buscaré alguna otra forma de automatizar la subida diaria de archivos que no sea abriendo el ftp manualmente y subiendo, jeje. De todas forma si alguien ha encontrado algo QUE NO DUDE EN CONTARLO

    Gracias y saludos

  11. Supongo que algo que podrías intentar es conseguirte un FTP de línea de comando, una búsqueda rápida en google me llevó a http://www.coreftp.com/.

    Bueno, entonces si puedes enviar comandos de FTP desde una ventanita de MS-DOS, y te funciona bien, ya lo resolviste, porque puedes crear un archivo .bat y calendarizarlo con el calendarizador de tareas de windows. Digamos, que se corra una vez al día y envíe los comandos FTP que requieres.

    No sé bien cuál es exáctamente tu problema, pero quizás esa idea te ayude.

    Suerte!

  12. Gracias Pablo, pero te cuento.

    Estoy intentando generar un paquete ssis (vs2005) para recoger unas tablas diariamente y subirlas a un ftp. El caso es q este programa tiene una herramienta (tarea ftp) por la cual no puedo hacerlo. Al final decidí derivarlo a una secuencia de comandos en vb.net. pero, con el código primero consigo subir ficheros hasta que llega a uno grande, y a partir de ahí falla la tarea.
    Como tu bien pones lo que tendre que hacer al final sera un bat para subirlo pero todo era por ejecutar un trabajo completo desde el sql server 2005.

    Gracias y saludos desde España

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


− 5 = tres