2014-02-09 4 views
3

, поэтому я пытаюсь автоматизировать загрузку в ftp, но я не могу заставить его работать. То, что у меня есть (пытается создать папку):FTP создайте папку и загрузите файлы в C#

private void button1_Click(object sender, EventArgs e) 
{ 
    FTPUpload(txtIP.Text, txtUName.Text, txtPWord.Text); 
} 

private void FTPUpload(string ftpAddress, string ftpUName, string ftpPWord) 
{ 
    FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpAddress + "/AUTO_TEST_FOLDER")); 
    ftpRequest.Credentials = new NetworkCredential(ftpUName, ftpPWord); 
    ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory; 
    WebResponse response = ftpRequest.GetResponse(); 
    using (var resp = (FtpWebResponse)ftpRequest.GetResponse()) 
    { 
     MessageBox.Show(resp.StatusCode.ToString()); 
    } 

Я получаю WebException был необработанное «Удаленный сервер возвратил ошибку: (550) не Файл недоступен (например, файл не найден, нет доступа).» на линии WebResponse response = ftpRequest.GetResponse();.

Может кто-нибудь помочь мне здесь?

Я пробовал пару решений, включая ответ на How do I create a directory on ftp server using C#?, но без успеха (без успеха даже с копированием и вставкой этого ответа и ввода моего ip/uname/pword).

ответ

1

мне удалось получить его работу с:

private void FtpCreateFolder(string ftpAddress, string ftpUName, string ftpPWord) 
    { 
      WebRequest ftpRequest = WebRequest.Create("ftp://" + ftpAddress + "/AUTO_TEST_FOLDER"); 
      ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory; 
      ftpRequest.Credentials = new NetworkCredential(ftpUName, ftpPWord); 
    } 

Я думаю, проблема была с помощью FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(...). Спасибо в любом случае, ТАК, надеюсь, что кто-то найдет это полезным!

-1

Я знаю, что это старая нить, но я думал, что брошу свои 2 цента. Раньше у меня была проблема получения успеха или отказа от работы с FTP-сервером, и ничто из того, что я мог найти, действительно работало лучше, чем то, что я вытащил из тестовой программы, которую я использовал для создания моего фактического приложения. Похоже, большая проблема связана с получением ответа на успех или сбоем при попытке создать папку. Другая проблема возникает, поскольку существует несколько типов исключений. У меня есть как WebException, так и Exception в разных точках, поэтому поэтому я использую общий код Exception в своем коде. Это то, что работает для меня. Небольшое изменение от ОП - использование (FtpWebRequest)WebRequest по сравнению с тем, что у них было.

public static bool CreateFolder(string folder) 
    { 
     bool success = false; 

     System.Net.FtpWebRequest ftp_web_request = null; 
     System.Net.FtpWebResponse ftp_web_response = null; 

     string ftp_path = @"ftp://foo.bar.com/" + folder; 

     try 
     { 
      ftp_web_request = (FtpWebRequest)WebRequest.Create(ftp_path); 
      ftp_web_request.Method = WebRequestMethods.Ftp.MakeDirectory; 
      ftp_web_request.Credentials = new NetworkCredential("username", "password"); 

      ftp_web_response = (FtpWebResponse)ftp_web_request.GetResponse(); 

      string ftp_response = ftp_web_response.StatusDescription; 
      string status_code = Convert.ToString(ftp_web_response.StatusCode); 

      ftp_web_response.Close(); 

      success = true; 
     } 
     catch (Exception Ex) 
     { 
      string status = Convert.ToString(Ex); 

      MessageBox.Show("Failed to create folder." + Environment.NewLine + status); //debug 
     } 

     return success; 
    } 

Для загрузки нескольких файлов используется следующее. Я передаю в Dictionary, где ключ - это имя файла, а значение - путь.

public static bool UploadFile(string folder, Dictionary<string, string> Photo_Paths) 
    { 
     bool success = false; 

     FtpWebRequest ftp_web_request = null; 
     FtpWebResponse ftp_web_response = null; 

     foreach (KeyValuePair<string, string> item in Photo_Paths) 
     { 
      string subdomain = ConfigurationManager.AppSettings["subdomain"]; 
      string ftp_path = @"ftp://foo.bar.com/" + folder + @"/" + item.Key; 

      try 
      { 
       ftp_web_request = (FtpWebRequest)WebRequest.Create(ftp_path); 
       ftp_web_request.UseBinary = true; 
       ftp_web_request.UsePassive = false; 
       ftp_web_request.EnableSsl = false; 
       ftp_web_request.Method = WebRequestMethods.Ftp.UploadFile; 
       ftp_web_request.Credentials = new NetworkCredential("username", "password"); 

       try 
       { 
        MessageBox.Show(item.Value); //debug 

        byte[] buffer = File.ReadAllBytes(item.Value); 

        using (Stream file_stream = ftp_web_request.GetRequestStream()) 
        { 
         file_stream.Write(buffer, 0, buffer.Length); 
        } 

        ftp_web_response = (FtpWebResponse)ftp_web_request.GetResponse(); 

        if (ftp_web_response != null) 
        { 
         string ftp_response = ftp_web_response.StatusDescription; 
         string status_code = Convert.ToString(ftp_web_response.StatusCode); 

         MessageBox.Show(ftp_response + Environment.NewLine + status_code); //debug 
        } 
       } 
       catch (Exception Ex) //(WebException Ex) 
       { 
        //string status = ((FtpWebResponse)Ex.Response).StatusDescription; 
        string status = Convert.ToString(Ex); 

        MessageBox.Show("Failed upload a file." + Environment.NewLine + status); //debug 
       } 

       ftp_web_response.Close(); 

       success = true; 
      } 
      catch (Exception Ex) 
      { 
       //string status = ((FtpWebResponse)Ex.Response).StatusDescription; 
       string status = Convert.ToString(Ex); 

       if (ftp_web_response != null) 
       { 
        string ftp_response = ftp_web_response.StatusDescription; 
        string status_code = Convert.ToString(ftp_web_response.StatusCode); 

        MessageBox.Show(ftp_response + Environment.NewLine + status_code); //debug 
       } 

       MessageBox.Show("Failed upload a file." + Environment.NewLine + status); //debug 
      } 
     } 

     return success; 
    } 
+0

_ «Я создал эту функцию, которая отлично работает» _ - ну, это похоже на ваше мнение. Это не работает отлично. Если есть проблема с полномочиями или соединением, этот код проглатывает полученное исключение, показывает окно с сообщением «Folder Exists» и возвращает «false». Это далеко не идеально. – CodeCaster

+0

Я вытащил это из своей тестовой программы, поэтому там есть вещи, которые, очевидно, будут удалены или изменены. Я также исправил, что обмен сообщениями как «Folder Exists» был в старой версии кода. В идеале я бы использовал WebException, а затем посмотрел, какая именно проблема. –

+0

Да, в чем смысл этого ответа? Вы завернули существующий ответ в блок try-catch и отправили свой метод для загрузки некоторых фотографий из некоторых очень специфичных для приложения переменных? Второй код возвращает false, если первый файл завершается успешно, а второй - нет. Он загружает целые файлы в памяти (даже большие), которые не масштабируются. Методы библиотеки не должны ловить 'Исключение' и определенно не должны показывать окна сообщений. – CodeCaster