Esempio di codice client FTP (codice sorgente C#): connessione al server FTP di DriveHQMolti utenti ci hanno chiesto come connettersi al server FTP di DriveHQ nei propri progetti software. In questo messaggio, vorremmo innanzitutto fornire alcune informazioni generali su FTP, seguite da del codice sorgente in C#.
DriveHQ offre un servizio di hosting server FTP. Supportiamo i protocolli FTP e FTPS standard. Uno dei principali vantaggi del nostro servizio FTP è: è perfettamente integrato con i nostri ampi servizi IT cloud. Gli utenti possono accedere ai propri file FTP tramite browser web, unità mappata (WebDAV) oppure tramite il software client DriveHQ FileManager. Possono anche utilizzare il nostro strumento di amministrazione di gruppo basato sul web per creare e gestire utenti FTP (sottoutenti).
Il protocollo FTP standard è considerato insicuro in quanto trasmette i dati senza crittografia. Per una maggiore sicurezza SSL, è possibile utilizzare FTPS (FTP su SSL/TLS). Esistono due metodi per attivare la sicurezza SSL:
Implicito: Il client FTP si connette direttamente a una porta FTPS dedicata (quella predefinita è la 990);
Esplicito (FTPES): Il client FTP si connette alla porta FTP standard numero 21 e quindi invia il comando STARTTLS per aumentare il livello di sicurezza.
Il server FTP di DriveHQ supporta sia FTPS che FTPES. La maggior parte delle applicazioni client FTP supportano entrambi i protocolli, ad esempio FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP e Fetch, ecc.
Esiste un altro protocollo di trasferimento file sicuro chiamato SFTP, che viene spesso confuso con "Secure FTP"; in realtà, SFTP sta per "SSH File Transfer Protocol", un protocollo di trasferimento file completamente diverso. Dal punto di vista della sicurezza, SSL/TLS e SSH sono pressoché identici. Chiaramente, SSL/TLS è più diffuso di SSH. Il server FTP di DriveHQ non supporta SFTP in quanto non ne riscontriamo una forte necessità.
Modalità FTP attiva e passiva:
Una connessione FTP può includere due connessioni TCP (canali): il canale di comando e il canale dati. Il canale di comando viene utilizzato per inviare comandi FTP, mentre il canale dati viene utilizzato per trasferire grandi quantità di dati. La modalità FTP attiva richiede che il server FTP si connetta al client FTP per stabilire la connessione dati. Questa modalità è spesso considerata insicura e viene bloccata da molti firewall/router. La modalità FTP passiva richiede che il client FTP si connetta al server FTP su una porta diversa. È considerata sicura e raramente viene bloccata. Il server FTP di DriveHQ supporta sia la modalità FTP attiva che quella passiva. Tuttavia, se il router/firewall o il software di sicurezza bloccano la modalità FTP attiva, questa non funzionerà. È interessante notare che la maggior parte dei router moderni supporta la modalità FTP attiva.
Nota bene: il client FTP da riga di comando di Microsoft non supporta l'FTP passivo. Quasi tutti gli altri programmi client FTP supportano sia l'FTP attivo che quello passivo.
FTP e ProFTP
DriveHQ dispone di due siti FTP: uno è ftp.drivehq.com, accessibile a tutti gli utenti; l'altro è proftp.drivehq.com, disponibile solo per gli abbonati a pagamento (inclusi i sottoutenti di un account di gruppo a pagamento). Poiché proftp.drivehq.com è disponibile solo per gli abbonati a pagamento, non supporta l'FTP anonimo. Per ulteriori informazioni sul nostro servizio di hosting server FTP, visitare:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Esempio di codice sorgente di un client FTP
Il seguente codice sorgente C# viene fornito così com'è, senza alcun supporto. Siete liberi di utilizzarlo nel vostro software o di ridistribuirlo. Il codice di esempio mostra come connettersi al nostro server FTP ed eseguire comandi FTP, come LIST, GET e PUT; potete anche vedere come configurarlo per utilizzare FTP passivo e SSL.
utilizzando il sistema;
Utilizzo di System.Collections.Generic;
Utilizzo di System.Linq;
utilizzando System.Text;
Utilizzo di System.Threading.Tasks;
utilizzando System.Net;
Utilizzo di System.IO;
Utilizzo di System.Security.Cryptography.X509Certificates;
///
/// Copyright (c) 2003-2016, Drive Headquarters, Inc.
///
/// Il codice di esempio del client FTP mostra come connettersi al server FTP di DriveHQ utilizzando C#.
/// Puoi utilizzare il codice o ridistribuirlo gratuitamente. Il codice è fornito COSÌ COM'È senza
/// nessun supporto o garanzia. DriveHQ non si assume alcuna responsabilità derivante dall'utilizzo del codice.
///
namespace FTPClientSample
{
Programma del corso
{
static string ftpServer = "ftp.drivehq.com"; // Puoi anche usare ftp.drivehq.com se hai un account a pagamento.
static string username = "YOUR_USERNAME"; // Il tuo nome utente di DriveHQ
static string password = "YOUR_PASSWORD"; // La tua password di DriveHQ
static void Main(string[] args)
{
// Elenca una cartella sul server FTP
//Lista("/");
// Scaricare un file dal server FTP
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Carica un file sul server FTP
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Carica un file sul server FTP.
///
/// un percorso di file locale
/// il percorso sul server FTP, ad esempio /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
se (Stringa.ÈNullaOSpazioBianco(percorsoFileSrc))
genera una nuova ArgumentNullException("Percorso del file sorgente.");
se (Stringa.ÈNulloOSpazioBianco(percorsoFileDestinazione))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// L'URI del server dovrebbe iniziare con lo schema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
restituire falso;
Richiesta FtpWebRequest = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// leggere il contenuto del file in un array di byte
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = nuovo byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// inviare il contenuto del file al server FTP
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Stato della risposta: {0} - {1}", response.StatusCode, response.StatusDescription);
restituisci vero;
}
///
/// Scarica il file specificato nel percorso srcFilePath dal server FTP nella cartella specificata nel percorso destFilePath. Se il file è nullo, salvalo nella cartella corrente.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
se (Stringa.ÈNullaOSpazioBianco(percorsoFileSrc))
genera una nuova ArgumentNullException("Percorso del file sorgente.");
se (Stringa.ÈNulloOSpazioBianco(percorsoFileDestinazione))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// L'URI del server dovrebbe iniziare con lo schema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
restituire falso;
Richiesta FtpWebRequest = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream fileStream = new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buffer = nuovo byte[32 * 1024];
mentre(vero) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
se (bytesRead == 0)
rottura;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Stato della risposta: {0} - {1}", response.StatusCode, response.StatusDescription);
restituisci vero;
}
///
/// Elenca il contenuto di una cartella FTP
///
///
pubblico statico stringa List(string path)
{
Uri serverUri = GetUri(path);
//// L'URI del server dovrebbe iniziare con lo schema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
ritorno "";
Richiesta FtpWebRequest = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string risultato = sr.ReadToEnd();
Console.WriteLine("Stato della risposta: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + risultato);
restituisci il risultato;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
Richiesta FtpWebRequest = (FtpWebRequest)WebRequest.Create(serverUri);
richiesta.AbilitaSSL = vero;
richiesta.UsaPassivo = vero;
richiesta.UsaBinario = vero;
richiesta.KeepAlive = true;
request.Credentials = new NetworkCredential(username, password);
richiesta.Metodo = metodo;
richiesta di ritorno;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
restituisci un nuovo Uri(ftpServerUri, remoteFilePath);
}
}
}