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:
-
Imports System.Net
-
Imports System.IO
Este es el código para subir el archivo:
VB.NET:
-
'Subir Archivo por FTP
-
' Configurar el Request
-
Dim ElRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://servidorejemplo.com/folder1/archivo.zip"), FtpWebRequest)
-
ElRequest.Credentials = New NetworkCredential("usuario", "password")
-
ElRequest.Method = WebRequestMethods.Ftp.UploadFile
-
-
' Leer archivo
-
-
' Subir archivo
-
Dim ElStream As System.IO.Stream = ElRequest.GetRequestStream()
-
ElStream.Write(BufferArchivo, 0, BufferArchivo.Length)
-
ElStream.Close()
-
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.
Marzo 6th, 2008 at 6:21
Si el fichero es superior a 1611653 bytes dara un error inesperado.
Abril 29th, 2008 at 19:20
Hola, quisiera saber como lo puedo hacer en VS2003???
Octubre 22nd, 2008 at 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.-
Octubre 22nd, 2008 at 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)
Octubre 22nd, 2008 at 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.
Octubre 23rd, 2008 at 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…
Octubre 23rd, 2008 at 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!!!!
Octubre 23rd, 2008 at 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.
Octubre 23rd, 2008 at 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
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”);
}
}
Octubre 23rd, 2008 at 16:10
Perfecto Javier, que bueno que lo solucionaste.
Gracias por compartir la solución, quizás a alguien le sirva.