Не удается загрузить файл на ftp-сервер

У меня есть небольшая winform C #, в которой я создаю несколько текстовых файлов, а затем перемещаю их на ftp-сервер. Когда я пытаюсь переместить их на рабочий сервер, он не работает под

Удаленный сервер возвратил ошибку: (530) Не авторизован.

Если я вхожу в ftp через cmd / ftp с тем же адресом ftp, именем пользователя и паролем, все в порядке. Я также установил локальный ftp-сервер на свой компьютер и протестировал его, чтобы увидеть, может ли мой код генерировать ошибку, но локально он работает как шарм, у меня проблема только с производственным ftp-сервером. Ниже мой код для подключения и загрузки файлов на ftp-сервер:

string[] FileName = Directory.GetFiles(outputpath);

foreach (string txtFile in FileName)
{
     FileInfo toUpload = new FileInfo(txtFile);

     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + tbFTPAddress.Text + @"//" + toUpload.Name);

     request.Credentials = new NetworkCredential(tbFTPUserName.Text.Trim(), tbFTPPassword.Text.Trim());

     request.Method = WebRequestMethods.Ftp.UploadFile;

     Stream ftpStream = request.GetRequestStream();
     FileStream file = File.OpenRead(txtFile);

     int length = 1024;
     byte[] buffer = new byte[length];
     int bytesRead = 0;

     try
     {
         do
         {
             bytesRead = file.Read(buffer, 0, length);
             ftpStream.Write(buffer, 0, bytesRead);
         }
         while (bytesRead != 0);

         file.Close();
         ftpStream.Close();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "Error encountered!", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     finally
     {
         if (file != null) file.Close();
         if (ftpStream != null) ftpStream.Close();
     }
}

Ошибка возникает по адресу: Stream ftpStream = request.GetRequestStream();

Любые идеи?

Спасибо!


person Sergiu    schedule 19.11.2013    source источник
comment
Добавлю, что пароль содержит символ *. Может это проблема?   -  person Sergiu    schedule 19.11.2013
comment
вы пробовали это с другим внешним ftp-сервером?   -  person Noctis    schedule 19.11.2013


Ответы (2)


сначала вам нужно вызвать GetResponse ().

        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(Username, Password);

        try
        {
            //You have to call this or you would be unable to get a stream :)
            WebResponse response = fwr.GetResponse();
        }
        catch (Exception e)
        {
            throw e;
        }

        FileStream fs = new FileStream(localfile), FileMode.Open);
        byte[] fileContents = new byte[fs.Length];
        fs.Read(fileContents, 0, Convert.ToInt32(fs.Length));
        fs.Flush();
        fs.Close();

        //Now you are able to open a Stream
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(fileContents, 0, fileContents.Length);
        requestStream.Close();

        request.Abort();
person Marcel Croonenbroeck    schedule 19.11.2013
comment
Привет, Марсель, спасибо за отзыв, но теперь даже на моем локальном ftp-сервере он не работает под The remote server returned an error: (550) File unavailable (e.g., file not found, no access). на Stream ftpStream = request.GetRequestStream(); Вот измененный код в соответствии с вашим предложением: request.Method = WebRequestMethods.Ftp.UploadFile; try { WebResponse response = request.GetResponse(); } catch (Exception ex) { throw ex; } Stream ftpStream = request.GetRequestStream(); { throw ex; } Stream ftpStream = request.GetRequestStream(); FileStream file = File.OpenRead(txtFile); - person Sergiu; 19.11.2013
comment
Кроме того, позвольте мне СНОВА добавить, что локально код работает и создает / перемещает файлы. Поэтому я не думаю, что проблема связана с отсутствующим вызовом GetResponse (). - person Sergiu; 19.11.2013
comment
звучит как странная проблема :). Удаленный FTP работает с такими же настройками? Если нет, проверьте свою конфигурацию. Возможно, удаленный сервер использует sftp или имеет другие ограничения. - person Marcel Croonenbroeck; 19.11.2013
comment
Что вы подразумеваете под одинаковыми настройками? К сожалению, производственный ftp-сервер, на который я пытаюсь переместить файлы, принадлежит партнерской компании, и я не могу получить о нем дополнительную информацию, кроме имени пользователя и пароля, которые они нам уже предоставили. Если это действительно сервер SFTP, будет ли это иметь значение? Спасибо! - person Sergiu; 19.11.2013

У меня тоже была эта ошибка. (Вам не нужно сначала получать ответ.) В моем случае это была проблема с правами доступа к папке на FTP-сервере.

  1. Удаленный доступ к вашему FTP-серверу
  2. Перейдите к папке / подпапке и щелкните ее правой кнопкой мыши.
  3. Выбрать свойства
  4. Перейдите на вкладку Безопасность
  5. Нажмите кнопку "Изменить".
  6. Убедитесь, что у учетной записи пользователя IIS есть доступ на запись
person CZahrobsky    schedule 08.07.2014