Пример кода FTP-клиента (исходный код на C#): подключение к FTP-серверу DriveHQМногие пользователи спрашивали, как подключиться к FTP-серверу DriveHQ в своих программных проектах. В этом сообщении мы хотели бы сначала предоставить общую информацию о FTP, а затем привести исходный код на C#.
DriveHQ предлагает услуги хостинга FTP-серверов. Мы поддерживаем стандартные протоколы FTP и FTPS. Одно из главных преимуществ нашего FTP-сервиса: он легко интегрируется с нашими многочисленными облачными IT-сервисами. Пользователи могут получать доступ к своим FTP-файлам через веб-браузер. Подключенный сетевой диск (WebDAV) или клиентское программное обеспечение DriveHQ FileManager. Они также могут использовать наш веб-инструмент для управления группами пользователей, чтобы создавать и управлять FTP-пользователями (дочерними пользователями).
Обычный протокол FTP считается небезопасным, поскольку передает данные без шифрования. Для надежной защиты SSL можно использовать FTPS (FTP через SSL/TLS). Существует два способа обеспечения безопасности SSL:
Скрытый: FTP-клиент напрямую подключается к специальному номеру порта FTPS (по умолчанию 990);
Явный (FTPES): FTP-клиент подключается к стандартному FTP-порту номер 21, а затем отправляет команду STARTTLS для повышения уровня безопасности.
FTP-сервер DriveHQ поддерживает как FTPS, так и FTPES. Большинство FTP-клиентов поддерживают FTPS и FTPES, например, FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP и Fetch и др.
Существует ещё один защищённый протокол передачи файлов, называемый SFTP, который часто путают с «Secure FTP»; на самом деле он означает «SSH File Transfer Protocol» — совершенно другой протокол передачи файлов. С точки зрения безопасности SSL/TLS и SSH практически идентичны. Очевидно, что SSL/TLS более популярен, чем SSH. FTP-сервер DriveHQ не поддерживает SFTP, поскольку мы не видим в этом острой необходимости.
Активный и пассивный режимы FTP:
FTP-соединение может включать два TCP-соединения (канала): канал команд и канал данных. Канал команд используется для отправки FTP-команд; канал данных — для передачи больших объемов данных. В активном режиме FTP FTP-сервер должен установить обратное соединение с FTP-клиентом для передачи данных. Этот режим часто считается небезопасным и блокируется многими брандмауэрами/маршрутизаторами. В пассивном режиме FTP FTP-клиент должен подключиться к FTP-серверу через другой номер порта. Этот режим считается безопасным и редко блокируется. FTP-сервер DriveHQ поддерживает как активный, так и пассивный FTP. Однако, если ваш маршрутизатор/брандмауэр или программное обеспечение безопасности блокирует активный FTP, он работать не будет. Интересно отметить, что большинство новых маршрутизаторов поддерживают активный FTP.
Обратите внимание: FTP-клиент командной строки от Microsoft не поддерживает пассивный FTP. Практически все остальные FTP-клиенты поддерживают как активный, так и пассивный FTP.
FTP и ProFTP
У DriveHQ есть два FTP-сервера: один — ftp.drivehq.com, доступный всем пользователям; другой — proftp.drivehq.com, доступный только платным подписчикам (включая субпользователей платной групповой учетной записи). Поскольку proftp.drivehq.com доступен только платным подписчикам, он не поддерживает анонимный FTP. Для получения дополнительной информации о нашей услуге хостинга FTP-серверов, пожалуйста, посетите [ссылка]:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Пример исходного кода FTP-клиента
Приведенный ниже исходный код на C# предоставляется как есть, без какой-либо поддержки. Вы можете свободно использовать его в своем программном обеспечении или распространять его. Пример кода показывает, как подключиться к нашему FTP-серверу и выполнять команды FTP, такие как LIST, GET и PUT; вы также можете увидеть, как настроить его на использование пассивного FTP и SSL.
используя систему;
using System.Collections.Generic;
с использованием System.Linq;
using System.Text;
с использованием System.Threading.Tasks;
с использованием System.Net;
с использованием System.IO;
с использованием System.Security.Cryptography.X509Certificates;
/// <краткое содержание>
/// Авторские права (c) 2003-2016, Drive Headquarters, Inc.
///
/// В приведенном примере кода FTP-клиента показано, как подключиться к FTP-серверу DriveHQ с помощью C#.
/// Вы можете использовать этот код или распространять его бесплатно. Код предоставляется «как есть», без каких-либо условий
/// Никакой поддержки или гарантии. DriveHQ не несет никакой ответственности за использование кода.
///
пространство имен FTPClientSample
{
класс Программа
{
static string ftpServer = "ftp.drivehq.com"; // Вы также можете использовать proftp.drivehq.com, если у вас платный аккаунт.
static string username = "YOUR_USERNAME"; // Ваше имя пользователя DriveHQ
static string password = "YOUR_PASSWORD"; // Ваш пароль от DriveHQ
static void Main(string[] args)
{
// Вывести список папок на FTP-сервере
//Список("/");
// Скачать файл с FTP-сервера
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Загрузите файл на FTP-сервер
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
/// <краткое содержание>
/// Загрузите файл на FTP-сервер.
///
/// путь к локальному файлу
/// путь на FTP-сервере, например, /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
if (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Source FilePath.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// serverUri должен начинаться со схемы ftp://.
если (serverUri.Scheme != Uri.UriSchemeFtp)
вернуть false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// чтение содержимого файла в массив байтов
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// отправить содержимое файла на FTP-сервер
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Статус ответа: {0} - {1}", response.StatusCode, response.StatusDescription);
вернуть true;
}
/// <краткое содержание>
/// Загрузите файл srcFilePath с FTP-сервера в папку destFilePath. Если значение равно null, сохраните файл в текущую папку.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
if (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("Source FilePath.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// serverUri должен начинаться со схемы ftp://.
если (serverUri.Scheme != Uri.UriSchemeFtp)
вернуть 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];
пока(true) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
если (bytesRead == 0)
перерыв;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Статус ответа: {0} - {1}", response.StatusCode, response.StatusDescription);
вернуть true;
}
/// <краткое содержание>
/// Отобразить содержимое папки FTP
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// serverUri должен начинаться со схемы ftp://.
если (serverUri.Scheme != Uri.UriSchemeFtp)
возвращаться "";
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("Статус ответа: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
вернуть результат;
}
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;
запрос на возврат;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
return new Uri(ftpServerUri, remoteFilePath);
}
}
}