Загрузка файла из контекста на ftp-сервер
Примечание
Перед началом работы со сценариями рекомендуется ознакомиться со стандартами написания программного кода на языке C#.
В статье приведен пример:
- загрузки файла в определенную папку на ftp-сервере;
- проверки наличия папки на ftp-сервере;
- создания папки, если она отсутствует.
Для корректной работы необходимо подключить пространство имен:
using System.Net;
Текст сценария приведен ниже:
#region FTP //Имя пользователя для подключения к фтп-серверу string userName = "username"; //Пароль для подключения к фтп-серверу string password = "password"; public void FTPMain(Context context) { //Ссылка на фтп string uri = "ftp://" + "ftp.example.ru" + "/"; //Имя папки, в которую необходимо загрузить файл string nameFolder = "NameFolder"; string answer = ""; //Проверяем, есть ли папка на фтп-сервере if (FTPCheckFolder(uri, nameFolder)) { uri += "NameFolder" + "/"; //Загружаем файл и получаем путь до файла на фтп-сервере answer = FTPUploadFile(uri, context.File.ContentFilePath, context.File.Name); } else { uri += "NameFolder"; //Создаем папку на фтп-сервере FTPCreateFolder(uri); uri += "/"; //Загружаем файл и получаем путь до файла на фтп-сервере answer = FTPUploadFile(uri, context.File.ContentFilePath, context.File.Name); } //Выводим путь до файла в консоль Console.WriteLine(answer); } protected bool FTPCheckFolder(string uri, string nameFolder) { FtpWebRequest reqFTP; //Создаем объект FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); //Указываеи учетную запись reqFTP.Credentials = new NetworkCredential(userName, password); reqFTP.KeepAlive = false; //Выбираем метод, который возвращает подробный список файлов на фтп-сервере reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; reqFTP.UseBinary = true; //Получаем ответ от фтп-сервера FtpWebResponse resp = (FtpWebResponse)reqFTP.GetResponse(); //Получаем поток данных Stream responseStream = resp.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); //Считываем данные из потока var contents = reader.ReadToEnd(); //Закрываем потоки reader.Close(); resp.Close(); //Разбиваем полученную строку на массив строк, проверяем есть ли там папка с именем nameFolder if (contents.Replace("\r\n", " ").Split(’ ’).Any(c => c == nameFolder)) return true; return false; } protected string FTPUploadFile(string uri, string filePath, string fileName) { FileInfo fileInf = new FileInfo(filePath); FtpWebRequest reqFTP; //Создаем объект FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + fileName)); //Указываеи учетную запись reqFTP.Credentials = new NetworkCredential(userName, password); reqFTP.KeepAlive = false; //Выбираем метод загрузки файла reqFTP.Method = WebRequestMethods.Ftp.UploadFile; //Тип передачи файла reqFTP.UseBinary = true; //Указываем размер файла reqFTP.ContentLength = fileInf.Length; //Буффер в 2 кбайт int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; //Открываем файловый поток FileStream fs = fileInf.OpenRead(); try { Stream strm = reqFTP.GetRequestStream(); //Читаем из потока по 2 кбайт contentLen = fs.Read(buff, 0, buffLength); //Пока файл не кончится while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // Закрываем потоки strm.Close(); fs.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } return uri + fileName; } protected void FTPCreateFolder(string uri) { FtpWebRequest reqFTP; //Создаем объект FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); //Указываем учетную запись reqFTP.Credentials = new NetworkCredential(userName, password); reqFTP.KeepAlive = false; //Выбираем метод создания папки reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; reqFTP.UseBinary = true; //Получаем ответ от фтп-сервера FtpWebResponse resp = (FtpWebResponse)reqFTP.GetResponse(); //Закрываем поток resp.Close(); } #endregion