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