Puede resultar muy útil que nuestra aplicación pueda enviar los resultados de sus acciones o depositarlos en un servidor FTP, nos puede servir tanto para enviar periódicamente archivos de log, resultados, estadísticas o cualquier otro tipo de fichero.
Este es un sencillo ejemplo de una función que envia un archivo por FTP a un determinada ruta remota:
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);
}
}
}
}
Para invocarlo, simplemente hay que pasarle los datos necesarios:
UploadFTP(@"C:\Archivo.txt", "ftp://ftp.vtortola.net/Upload", "MiUsuario", "MiPassword");
Hay que recordad que FTP es un protocolo inseguro, pues establece una comunicación sin cifrar tanto para la autenticación como para el control. Una mejor opción es usar FtpWebRequest.EnableSsl como podemos ver en este blog de Adarsh, pero claro, nuestro servidor FTP tiene que soportar la comunicación SSL (que no es el caso del mio :D).