Cómo subir un archivo por FTP usando ASP.NET 2

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:

VB.NET:
  1. Imports System.Net
  2. Imports System.IO

Este es el código para subir el archivo:

VB.NET:
  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:\Inetpub\wwwroot\archivo.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.

10 Responses

  1. Emilio Says:

    Si el fichero es superior a 1611653 bytes dara un error inesperado.

  2. leo Says:

    Hola, quisiera saber como lo puedo hacer en VS2003???

  3. Javier Says:

    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 Settings\Javi\Escritorio\cursogratuito.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 Settings\Javi\Mis documentos\Visual Studio 2005\22102008-subir.arx.server\listarftp.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.-

  4. Javier Says:

    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 Settings\Javi\Mis documentos\Visual Studio 2005\22102008-subir.arx.server\listarftp.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)

  5. Recursos Web Says:

    O no existe el archivo:
    D:\Documents and Settings\Javi\Escritorio\cursogratuito.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.

  6. Javier Says:

    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…

  7. Javier Says:

    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 Settings\Javi\Escritorio\cc.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 Settings\Javi\Mis documentos\Visual Studio 2005\22102008-subir.arx.server\listarftp.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!!!!

  8. Recursos Web Says:

    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.

  9. Javier Says:

    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 Settings\Javi\Escritorio\cc.html”, “ftp://ftp.miscursosgratuitos.com”, “user”, “pass”);
    UploadFTP(@”D:\Documents and Settings\Javi\Escritorio\cursos_gratuitos_gestion_conocimiento.aspx”, “ftp://ftp.miscursosgratuitos.com”, “user”, “pass”);

    }
    }

  10. Recursos Web Says:

    Perfecto Javier, que bueno que lo solucionaste.

    Gracias por compartir la solución, quizás a alguien le sirva.

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.