Código de ejemplo de cliente FTP (código fuente en C#): conexión al servidor FTP de DriveHQMuchos usuarios han preguntado cómo conectarse al servidor FTP de DriveHQ en sus propios proyectos de software. En este mensaje, primero proporcionaremos información general sobre FTP, seguida de un fragmento de código fuente en C#.
DriveHQ ofrece servicio de alojamiento de servidor FTP. Admitimos los protocolos FTP y FTPS estándar. Una de las principales ventajas de nuestro servicio FTP es: está perfectamente integrado con nuestros amplios servicios de TI en la nube. Los usuarios pueden acceder a sus archivos FTP mediante un navegador web, Unidad mapeada (WebDAV) o el software cliente DriveHQ FileManager. También pueden usar nuestra herramienta de administración de grupos basada en web para crear y administrar usuarios FTP (subusuarios).
El protocolo FTP estándar se considera inseguro, ya que transmite datos sin cifrado. Para una seguridad SSL robusta, puede utilizar FTPS (FTP sobre SSL/TLS). Existen dos métodos para activar la seguridad SSL:
Implícito: El cliente FTP se conecta directamente a un número de puerto FTPS especial (el predeterminado es el 990);
Explícito (FTPES): El cliente FTP se conecta al puerto FTP habitual número 21 y, a continuación, emite el comando STARTTLS para actualizar la seguridad.
El servidor FTP de DriveHQ admite tanto FTPS como FTPES. La mayoría de las aplicaciones cliente FTP admiten FTPS y FTPES, por ejemplo, FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP y Fetch, etc.
Existe otro protocolo seguro de transferencia de archivos llamado SFTP, que a menudo se confunde con "FTP seguro"; de hecho, significa "Protocolo de transferencia de archivos SSH", un protocolo de transferencia de archivos completamente diferente. Desde el punto de vista de la seguridad, SSL/TLS y SSH son prácticamente iguales. Claramente, SSL/TLS es más popular que SSH. El servidor FTP de DriveHQ no es compatible con SFTP, ya que no vemos una necesidad imperiosa de este protocolo.
FTP en modo activo y pasivo:
Una conexión FTP puede incluir dos conexiones TCP (canales): el canal de comandos y el canal de datos. El canal de comandos se utiliza para enviar comandos FTP; el canal de datos se utiliza para transferir grandes cantidades de datos. El FTP en modo activo requiere que el servidor FTP se conecte al cliente FTP para establecer la conexión de datos. Esto suele considerarse inseguro y muchos firewalls/routers lo bloquean. El FTP en modo pasivo requiere que el cliente FTP se conecte al servidor FTP en un número de puerto diferente. Se considera seguro y rara vez se bloquea. El servidor FTP de DriveHQ admite tanto FTP activo como pasivo. Sin embargo, si su router/firewall o software de seguridad bloquea el FTP activo, no funcionará. Es interesante observar que la mayoría de los routers modernos sí admiten FTP activo.
Nota: El cliente FTP de línea de comandos de Microsoft no admite FTP pasivo. Casi todos los demás programas cliente FTP admiten tanto FTP activo como pasivo.
FTP y ProFTP
DriveHQ cuenta con dos sitios FTP: ftp.drivehq.com, accesible para todos los usuarios; y proftp.drivehq.com, disponible solo para miembros de pago (incluidos los subusuarios de una cuenta de grupo de pago). Dado que proftp.drivehq.com solo está disponible para miembros de pago, no admite FTP anónimo. Para obtener más información sobre nuestro servicio de alojamiento de servidores FTP, visite:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Código fuente de ejemplo de un cliente FTP
El siguiente código fuente en C# se proporciona tal cual, sin ningún tipo de soporte. Puede usarlo libremente en su propio software o redistribuirlo. El código de ejemplo muestra cómo conectarse a nuestro servidor FTP y ejecutar comandos FTP, como LIST, GET y PUT; también puede ver cómo configurarlo para usar FTP pasivo y SSL.
usando el sistema;
usando System.Collections.Generic;
usando System.Linq;
usando System.Text;
usando System.Threading.Tasks;
usando System.Net;
usando System.IO;
utilizando System.Security.Cryptography.X509Certificates;
///
/// Copyright (c) 2003-2016, Drive Headquarters, Inc.
///
/// El código de ejemplo del cliente FTP muestra cómo conectarse al servidor FTP de DriveHQ usando C#.
/// Puedes usar el código o redistribuirlo gratuitamente. El código se proporciona TAL CUAL, sin restricciones
/// DriveHQ no ofrece soporte ni garantía. No se responsabiliza del uso de este código.
///
espacio de nombres FTPClientSample
{
Programa de clases
{
static string ftpServer = "ftp.drivehq.com"; // También puedes usar proftp.drivehq.com si tienes una cuenta de pago.
cadena estática nombre_de_usuario = "TU_NOMBRE_DE_USUARIO"; // Tu nombre de usuario de DriveHQ
cadena estática contraseña = "TU_CONTRASEÑA"; // Tu contraseña de DriveHQ
static void Main(string[] args)
{
// Enumerar una carpeta en el servidor FTP
//Lista("/");
// Descargar un archivo del servidor FTP
//DescargarArchivo("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Subir un archivo al servidor FTP
SubirArchivo(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Sube un archivo al servidor FTP.
///
/// una ruta de archivo local
/// la ruta en el servidor FTP, como /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
si (String.IsNullOrWhiteSpace(srcFilePath))
lanzar nueva ArgumentNullException("Ruta del archivo de origen.");
si (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// La URL del servidor debe comenzar con el esquema ftp://.
si (serverUri.Scheme != Uri.UriSchemeFtp)
devolver falso;
FtpWebRequest solicitud = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// leer el contenido del archivo en una matriz de bytes
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// enviar el contenido del archivo al servidor FTP
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse respuesta = (FtpWebResponse)solicitud.GetResponse();
Console.WriteLine("Estado de la respuesta: {0} - {1}", response.StatusCode, response.StatusDescription);
devolver verdadero;
}
///
/// Descarga el archivo srcFilePath del servidor FTP al archivo destFilePath. Si es nulo, guárdalo en la carpeta actual.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
si (String.IsNullOrWhiteSpace(srcFilePath))
lanzar nueva ArgumentNullException("Ruta del archivo de origen.");
si (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// La URL del servidor debe comenzar con el esquema ftp://.
si (serverUri.Scheme != Uri.UriSchemeFtp)
devolver falso;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse respuesta = (FtpWebResponse)solicitud.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream fileStream = new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write);
búfer de bytes[] = nuevo byte[32 * 1024];
mientras(verdadero) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
si (bytesLeídos == 0)
romper;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Estado de la respuesta: {0} - {1}", response.StatusCode, response.StatusDescription);
devolver verdadero;
}
///
/// Listar el contenido de una carpeta FTP
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// La URL del servidor debe comenzar con el esquema ftp://.
si (serverUri.Scheme != Uri.UriSchemeFtp)
devolver "";
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse respuesta = (FtpWebResponse)solicitud.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
cadena resultado = sr.ReadToEnd();
Console.WriteLine("Estado de la respuesta: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
devolver resultado;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest solicitud = (FtpWebRequest)WebRequest.Create(serverUri);
solicitud.HabilitarSsl = verdadero;
solicitud.UsePassive = verdadero;
solicitud.UseBinary = verdadero;
solicitud.MantenerEnVida = verdadero;
solicitud.Credenciales = nueva CredencialDeRed(nombredeusuario, contraseña);
solicitud.Método = método;
solicitud de devolución;
}
privado estático Uri GetUri(string rutaArchivoRemoto)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
devolver nueva Uri(ftpServerUri, remoteFilePath);
}
}
}