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.

  1. #1 by Emilio on 6 Marzo 2008 - 6:21

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

  2. #2 by leo on 29 Abril 2008 - 19:20

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

  3. #3 by Javier on 22 Octubre 2008 - 16:22

    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. #4 by Javier on 22 Octubre 2008 - 16:25

    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. #5 by Recursos Web on 22 Octubre 2008 - 16:58

    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. #6 by Javier on 23 Octubre 2008 - 2:18

    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. #7 by Javier on 23 Octubre 2008 - 2:55

    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. #8 by Recursos Web on 23 Octubre 2008 - 7:16

    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. #9 by Javier on 23 Octubre 2008 - 15:03

    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

    http://ftp.Credentials = new NetworkCredential(Login, Password);

    // Le digo que no mantenga la conexión activa al terminar.

    http://ftp.KeepAlive = false;

    // Indicamos que la operación es subir un archivo…

    http://ftp.Method = WebRequestMethods.Ftp.UploadFile;

    // … en modo binario … (podria ser como ASCII)

    http://ftp.UseBinary = true;

    // Indicamos la longitud total de lo que vamos a enviar.

    http://ftp.ContentLength = fs.Length;

    // Desactivo cualquier posible proxy http.

    // Ojo pues de saltar este paso podría usar

    // un proxy configurado en iexplorer

    http://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 = http://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. #10 by Recursos Web on 23 Octubre 2008 - 16:10

    Perfecto Javier, que bueno que lo solucionaste.

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

  11. #11 by eldaguilodekuliakan on 28 Noviembre 2008 - 12:38

    realmente se agradece lo voy a probar
    =)

  12. #12 by susana on 26 Febrero 2009 - 7:56

    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

  13. #13 by Pablo Viale on 26 Febrero 2009 - 9:20

    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.

  14. #14 by Susana on 26 Febrero 2009 - 9:50

    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

  15. #15 by Pablo Viale on 26 Febrero 2009 - 10:36

    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!

  16. #16 by Susana on 26 Febrero 2009 - 10:49

    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

  17. #17 by xosel on 29 Abril 2010 - 14:53

    como puedo crear una carpeta via ftp??

(No será publicado)