Subir un archivo a un servidor FTP utilizando C#
Si deseamos subir archivos a un servidor FTP con C#, podemos utilizar la clase FtpWebRequest del espacio de nombre System.Net del .NET Framework.
La utilización es bastante sencilla, simplemente creamos una solicitud sobre el servidor FTP indicando el nombre de archivo que tendrá el servidor remoto:
FtpWebRequest ftpRequest = (FtpWebRequest) WebRequest.Create("ftp://servidorFTP/directorio/archivo.txt");
Una vez creada la conexión asignamos las credenciales e indicamos que deseamos enviar un archivo y algunas propiedades básicas:
// Asigna las credenciales
ftpRequest.Credentials = new NetworkCredential("usuario", "Password");
// Asigna las propiedades
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.UsePassive = true;
ftpRequest.UseBinary = true;
ftpRequest.KeepAlive = false;
Y por último leemos el archivo en un stream y lo escribimos en el stream de FTP (para obtener el stream de comunicaciones utilizamos el método GetRequestStream del objeto FtpWebRequest ):
using (FileStream stmFile = File.OpenRead(strFileNameLocal))
{
// Obtiene el stream sobre la comunicación FTP
using (Stream stmFTP = ftpRequest.GetRequestStream())
{
byte[] arrBytBuffer = new byte[cnstIntLengthBuffer];
int intRead;
// Lee y escribe el archivo en el stream de comunicaciones
while ((intRead = stmFile.Read(arrBytBuffer, 0, cnstIntLengthBuffer)) != 0)
stmFTP.Write(arrBytBuffer, 0, intRead);
// Cierra el stream FTP
stmFTP.Close();
}
// Cierra el stream del archivo
stmFile.Close();
}
El siguiente bloque muestra el código completo en un único método:
/// <summary>
/// Envía un archivo por FTP
/// </summary>
public void Upload(string strServer, string strUser, string strPassword,
string strFileNameLocal, string strPathFTP)
{
FtpWebRequest ftpRequest;
// Crea el objeto de conexión del servidor FTP
ftpRequest = (FtpWebRequest) WebRequest.Create(string.Format("ftp://{0}/{1}", strServer,
Path.Combine(strPathFTP, Path.GetFileName(strFileNameLocal))));
// Asigna las credenciales
ftpRequest.Credentials = new NetworkCredential(strUser, strPassword);
// Asigna las propiedades
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.UsePassive = true;
ftpRequest.UseBinary = true;
ftpRequest.KeepAlive = false;
// Lee el archivo y lo envía
using (FileStream stmFile = File.OpenRead(strFileNameLocal))
{
// Obtiene el stream sobre la comunicación FTP
using (Stream stmFTP = ftpRequest.GetRequestStream())
{
byte[] arrBytBuffer = new byte[cnstIntLengthBuffer];
int intRead;
// Lee y escribe el archivo en el stream de comunicaciones
while ((intRead = stmFile.Read(arrBytBuffer, 0, cnstIntLengthBuffer)) != 0)
stmFTP.Write(arrBytBuffer, 0, intRead);
// Cierra el stream FTP
stmFTP.Close();
}
// Cierra el stream del archivo
stmFile.Close();
}
}
Nota: si desea información sobre cómo descargar un archivo de un servidor FTP lea el artículo: descargar archivo FTP.