FTP-Client-Beispielcode (C#-Quellcode): Verbindung zum FTP-Server von DriveHQ herstellenViele Nutzer haben gefragt, wie sie in ihren Softwareprojekten eine Verbindung zum FTP-Server von DriveHQ herstellen können. In dieser Nachricht möchten wir Ihnen zunächst einige allgemeine Informationen zu FTP geben und anschließend etwas C#-Quellcode bereitstellen.
DriveHQ bietet FTP-Server-Hosting an. Wir unterstützen die gängigen FTP- und FTPS-Protokolle. Einer der Hauptvorteile unseres FTP-Dienstes ist die nahtlose Integration in unsere umfassenden Cloud-IT-Services. Benutzer können über einen Webbrowser auf ihre FTP-Dateien zugreifen. zugeordnetes Laufwerk (WebDAV) oder die DriveHQ FileManager-Clientsoftware. Sie können auch unser webbasiertes Gruppenverwaltungstool verwenden, um FTP-Benutzer (Unterbenutzer) zu erstellen und zu verwalten.
Das reguläre FTP-Protokoll gilt als unsicher, da es Daten unverschlüsselt überträgt. Für eine hohe SSL-Sicherheit können Sie FTPS (FTP über SSL/TLS) verwenden. Es gibt zwei Methoden, um SSL-Sicherheit zu aktivieren:
Implizit: Der FTP-Client stellt eine direkte Verbindung zu einer speziellen FTPS-Portnummer her (Standard ist 990);
Explizit (FTPES): Der FTP-Client verbindet sich mit dem regulären FTP-Port 21 und sendet dann den Befehl STARTTLS, um die Sicherheit zu erhöhen.
Der FTP-Server von DriveHQ unterstützt sowohl FTPS als auch FTPES. Die meisten FTP-Client-Anwendungen unterstützen FTPS und FTPES, z. B. FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP und Fetch.
Es gibt ein weiteres sicheres Dateiübertragungsprotokoll namens SFTP, das oft mit „Secure FTP“ verwechselt wird. Tatsächlich steht SFTP für „SSH File Transfer Protocol“ und ist ein völlig anderes Protokoll. Aus Sicherheitssicht sind SSL/TLS und SSH vergleichbar. SSL/TLS ist jedoch deutlich verbreiteter als SSH. Der FTP-Server von DriveHQ unterstützt kein SFTP, da wir dafür keinen zwingenden Bedarf sehen.
FTP im aktiven und passiven Modus:
Eine FTP-Verbindung kann zwei TCP-Verbindungen (Kanäle) umfassen: den Befehlskanal und den Datenkanal. Der Befehlskanal dient zum Senden von FTP-Befehlen, der Datenkanal zur Übertragung großer Datenmengen. Beim aktiven FTP-Modus muss der FTP-Server eine Verbindung zum FTP-Client herstellen, um die Datenverbindung aufzubauen. Dies gilt als unsicher und wird von vielen Firewalls/Routern blockiert. Beim passiven FTP-Modus verbindet sich der FTP-Client über einen anderen Port mit dem FTP-Server. Dieser Modus gilt als sicher und wird selten blockiert. Der FTP-Server von DriveHQ unterstützt sowohl aktives als auch passives FTP. Wenn Ihr Router/Ihre Firewall oder Ihre Sicherheitssoftware jedoch aktives FTP blockiert, funktioniert es nicht. Interessanterweise unterstützen die meisten modernen Router aktives FTP.
Bitte beachten Sie: Der FTP-Client von Microsoft (Befehlszeile) unterstützt kein passives FTP. Fast alle anderen FTP-Client-Programme unterstützen sowohl aktives als auch passives FTP.
FTP und ProFTP
DriveHQ betreibt zwei FTP-Server: ftp.drivehq.com, der für alle Nutzer zugänglich ist, und proftp.drivehq.com, der ausschließlich zahlenden Mitgliedern (einschließlich Unternutzern von Gruppenkonten) zur Verfügung steht. Da proftp.drivehq.com nur zahlenden Mitgliedern zugänglich ist, wird anonymes FTP nicht unterstützt. Weitere Informationen zu unserem FTP-Server-Hosting-Service finden Sie unter [Link einfügen]:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Beispielquellcode für einen FTP-Client
Der folgende C#-Quellcode wird ohne jegliche Unterstützung bereitgestellt. Sie können ihn gerne in Ihrer eigenen Software verwenden oder weitergeben. Der Beispielcode zeigt, wie Sie eine Verbindung zu unserem FTP-Server herstellen und FTP-Befehle wie LIST, GET und PUT ausführen. Außerdem wird die Konfiguration für passives FTP und SSL erläutert.
System verwenden;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
///
/// Copyright (c) 2003-2016, Drive Headquarters, Inc.
///
/// Der Beispielcode für den FTP-Client zeigt, wie man mit C# eine Verbindung zum FTP-Server von DriveHQ herstellt.
/// Sie können den Code kostenlos verwenden oder weitergeben. Der Code wird ohne jegliche Gewährleistung bereitgestellt
/// Jeglicher Support oder Gewährleistungsanspruch wird von DriveHQ nicht übernommen. DriveHQ übernimmt keinerlei Haftung für die Verwendung des Codes.
///
Namespace FTPClientSample
{
Klassenprogramm
{
static string ftpServer = "ftp.drivehq.com"; // Sie können auch proftp.drivehq.com verwenden, wenn Sie ein kostenpflichtiges Konto haben.
static string username = "YOUR_USERNAME"; // Ihr DriveHQ-Benutzername
static string password = "YOUR_PASSWORD"; // Ihr DriveHQ-Passwort
static void Main(string[] args)
{
// Einen Ordner auf dem FTP-Server auflisten
//Liste("/");
// Laden Sie eine Datei vom FTP-Server herunter
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Laden Sie eine Datei auf den FTP-Server hoch
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Laden Sie eine Datei auf den FTP-Server hoch.
///
/// ein lokaler Dateipfad
/// Der Pfad auf dem FTP-Server, z. B. /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
if (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Quelldateipfad.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// Die Server-URI sollte mit dem Schema ftp:// beginnen.
if (serverUri.Scheme != Uri.UriSchemeFtp)
return false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// Dateiinhalt in Byte-Array einlesen
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// Senden Sie den Dateiinhalt an den FTP-Server
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Antwortstatus: {0} - {1}", response.StatusCode, response.StatusDescription);
gib true zurück;
}
///
/// Lade die Datei vom FTP-Server unter srcFilePath in das Verzeichnis destFilePath herunter. (Falls null, speichere die Datei im aktuellen Ordner.)
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
if (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Quelldateipfad.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// Die Server-URI sollte mit dem Schema ftp:// beginnen.
if (serverUri.Scheme != Uri.UriSchemeFtp)
return 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];
while(true) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
brechen;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Antwortstatus: {0} - {1}", response.StatusCode, response.StatusDescription);
gib true zurück;
}
///
/// Den Inhalt eines FTP-Ordners auflisten
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// Die Server-URI sollte mit dem Schema ftp:// beginnen.
if (serverUri.Scheme != Uri.UriSchemeFtp)
zurückkehren "";
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("Antwortstatus: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
Ergebnis zurückgeben;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.EnableSsl = true;
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
request.Credentials = new NetworkCredential(username, password);
request.Method = method;
Rücksendeanfrage;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
return new Uri(ftpServerUri, remoteFilePath);
}
}
}