Загрузка файла из контекста на ftp-сервер
Примечание
Перед началом работы со сценариями рекомендуется ознакомиться со стандартами написания программного кода на языке C#.
В статье приведен пример:
- загрузки файла в определенную папку на ftp-сервере;
- проверки наличия папки на ftp-сервере;
- создания папки, если она отсутствует.
Для корректной работы необходимо подключить пространство имен:
1 | using System.Net; |
Текст сценария приведен ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #region FTP //Имя пользователя для подключения к фтп-серверу string userName = "username" ; //Пароль для подключения к фтп-серверу string password = "password" ; public void FTPMain(Context context) { //Ссылка на фтп //Имя папки, в которую необходимо загрузить файл 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 |