Voorbeeldcode voor een FTP-client (C#-broncode): verbinding maken met de FTP-server van DriveHQVeel gebruikers hebben gevraagd hoe ze in hun eigen softwareprojecten verbinding kunnen maken met de FTP-server van DriveHQ. In dit bericht willen we eerst wat algemene informatie over FTP geven, gevolgd door een aantal C#-broncodevoorbeelden.
DriveHQ biedt FTP-serverhosting aan. We ondersteunen de gangbare FTP- en FTPS-protocollen. Een van de belangrijkste voordelen van onze FTP-service is de naadloze integratie met onze uitgebreide cloud-IT-diensten. Gebruikers hebben via een webbrowser toegang tot hun FTP-bestanden. toegewezen schijf (WebDAV) of de DriveHQ FileManager clientsoftware. Ze kunnen ook onze webgebaseerde Groepsbeheertool gebruiken om FTP-gebruikers (subgebruikers) aan te maken en te beheren.
Het reguliere FTP-protocol wordt als onveilig beschouwd omdat het gegevens zonder versleuteling verzendt. Voor sterke SSL-beveiliging kunt u FTPS (FTP over SSL/TLS) gebruiken. Er zijn twee methoden om SSL-beveiliging in te schakelen:
Impliciet: De FTP-client maakt rechtstreeks verbinding met een speciaal FTPS-poortnummer (standaard is 990);
Expliciet (FTPES): De FTP-client maakt verbinding met de reguliere FTP-poort 21 en geeft vervolgens het commando STARTTLS om de beveiliging te upgraden.
De FTP-server van DriveHQ ondersteunt zowel FTPS als FTPES. De meeste FTP-clienttoepassingen ondersteunen FTPS en FTPES, zoals FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP en Fetch, enzovoort.
Er bestaat nog een ander beveiligd bestandsoverdrachtprotocol genaamd SFTP, dat vaak wordt verward met "Secure FTP"; in feite staat het voor "SSH File Transfer Protocol", een compleet ander bestandsoverdrachtprotocol. Vanuit beveiligingsoogpunt zijn SSL/TLS en SSH vrijwel gelijk. SSL/TLS is duidelijk populairder dan SSH. De FTP-server van DriveHQ ondersteunt geen SFTP, omdat we daar geen sterke behoefte aan zien.
FTP in actieve en passieve modus:
Een FTP-verbinding kan twee TCP-verbindingen (kanalen) omvatten: het commandokanaal en het datakanaal. Het commandokanaal wordt gebruikt voor het verzenden van FTP-commando's; het datakanaal wordt gebruikt voor het overdragen van grote hoeveelheden data. Active Mode FTP vereist dat de FTP-server verbinding maakt met de FTP-client om de dataverbinding tot stand te brengen. Dit wordt vaak als onveilig beschouwd en wordt door veel firewalls/routers geblokkeerd. Passive Mode FTP vereist dat de FTP-client verbinding maakt met de FTP-server via een ander poortnummer. Dit wordt als veilig beschouwd en wordt zelden geblokkeerd. De FTP-server van DriveHQ ondersteunt zowel Active als Passive FTP. Als uw router/firewall of beveiligingssoftware Active FTP blokkeert, werkt het echter niet. Het is interessant om te weten dat de meeste nieuwe routers Active FTP ondersteunen.
Let op: de FTP-client van Microsoft voor de opdrachtregel ondersteunt geen passieve FTP. Vrijwel alle andere FTP-clientprogramma's ondersteunen zowel actieve als passieve FTP.
FTP en ProFTP
DriveHQ heeft twee FTP-sites: ftp.drivehq.com, die toegankelijk is voor alle gebruikers, en proftp.drivehq.com, die alleen beschikbaar is voor betalende leden (inclusief subgebruikers van een betaald groepsaccount). Omdat proftp.drivehq.com alleen beschikbaar is voor betalende leden, ondersteunt deze geen anonieme FTP. Ga voor meer informatie over onze FTP-serverhostingdienst naar [link]:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Voorbeeldbroncode van een FTP-client
De volgende C#-broncode wordt geleverd zoals deze is, zonder enige ondersteuning. U kunt deze vrij gebruiken in uw eigen software of verspreiden. De voorbeeldcode laat zien hoe u verbinding maakt met onze FTP-server en FTP-opdrachten uitvoert, zoals LIST, GET en PUT; u kunt ook zien hoe u passieve FTP en SSL instelt.
gebruikmakend van het systeem;
gebruikmakend van System.Collections.Generic;
gebruikmakend van System.Linq;
met behulp van System.Text;
gebruikmakend van System.Threading.Tasks;
gebruikmakend van System.Net;
System.IO gebruiken;
gebruikmakend van System.Security.Cryptography.X509Certificates;
///
/// Copyright (c) 2003-2016, Drive Headquarters, Inc.
///
/// De voorbeeldcode voor de FTP-client laat zien hoe je met C# verbinding kunt maken met de FTP-server van DriveHQ.
/// Je kunt de code gratis gebruiken of verspreiden. De code wordt geleverd zoals hij is, zonder enige beperkingen
/// DriveHQ biedt geen ondersteuning of garantie. DriveHQ aanvaardt geen enkele aansprakelijkheid voor het gebruik van de code.
///
naamruimte FTPClientSample
{
lesprogramma
{
static string ftpServer = "ftp.drivehq.com"; // Je kunt ook proftp.drivehq.com gebruiken als je een betaald account hebt.
statische string gebruikersnaam = "UW_GEBRUIKERSNAAM"; // Uw DriveHQ-gebruikersnaam
statische string password = "UW_WACHTWOORD"; // Uw DriveHQ-wachtwoord
statische void Main(string[] args)
{
// Een map op de FTP-server weergeven
//Lijst("/");
// Een bestand downloaden van de FTP-server
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Upload een bestand naar de FTP-server
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Upload een bestand naar de FTP-server.
///
/// een lokaal bestandspad
/// het pad op de FTP-server, bijvoorbeeld /temp/bestandsnaam
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
als String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Source FilePath.");
als (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// De serverUri moet beginnen met het ftp://-schema.
als (serverUri.Scheme != Uri.UriSchemeFtp)
retourneer false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// Lees de inhoud van het bestand in een byte-array
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// De inhoud van het bestand naar de FTP-server verzenden
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Reactiestatus: {0} - {1}", response.StatusCode, response.StatusDescription);
retourneer true;
}
///
/// Download het bestand srcFilePath van de FTP-server naar destFilePath. Als dit pad null is, wordt het bestand in de huidige map opgeslagen.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
als String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Source FilePath.");
als (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// De serverUri moet beginnen met het ftp://-schema.
als (serverUri.Scheme != Uri.UriSchemeFtp)
retourneer false;
FtpWebRequest request = 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 = new byte[32 * 1024];
terwijl(waar) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
als (bytesRead == 0)
pauze;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Reactiestatus: {0} - {1}", response.StatusCode, response.StatusDescription);
retourneer true;
}
///
/// De inhoud van een FTP-map weergeven
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// De serverUri moet beginnen met het ftp://-schema.
als (serverUri.Scheme != Uri.UriSchemeFtp)
opbrengst "";
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("Reactiestatus: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
resultaat retourneren;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.EnableSsl = true;
verzoek.GebruikPassief = true;
request.UseBinary = true;
request.KeepAlive = true;
request.Credentials = new NetworkCredential(username, password);
verzoek.Methode = methode;
retourverzoek;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
return new Uri(ftpServerUri, remoteFilePath);
}
}
}