logo

Загрузка файла из контекста на 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