2013-11-22 4 views
0

Я пытаюсь загрузить файл .txt на ftp-сервер. Но у меня есть некоторые проблемы. Я продолжаю получать эту ошибку: Удаленный сервер возвратил ошибку: (553) Имя файла не разрешено.Ошибка при загрузке файла на FTP-сервер C#

Это всегда происходит на этой линии:

Stream writer = ftpReq.GetRequestStream(); 

Я не могу понять, в чем проблема. Я попытался загрузить файл с filezilla, и это работает нормально. Я также попытался скопировать URL-адрес назначения файла с сервера и записать его в мое приложение, но я все равно получаю ту же ошибку. Есть ли другие способы загрузки файла на ftp-сервер?

это мой код:

string localFilePath = @"\\fileprint\data\Groups\Operation\fileExports\folder\"; 
string archiveFilePath = @"\\fileprint\data\Groups\Operation\fileExports\folder\Archive\"; 
string logFilePath = @"C:\Users\lmy\Desktop\Logs"; 
string ftpServer = "ftp://my.server.no:21/home/pll332/tmp/"; 
private string logFileName = "" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString(); 
string userName = "pll332"; 
string password = "password"; 

public Controller() 
{ 
} 

public void UploadFile() 
{ 
    try 
    { 
     string[] files = Directory.GetFiles(localFilePath); 
     foreach (string file in files) 
     { 
      string fileName = Path.GetFileName(file); 
      FtpWebRequest ftpReq = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServer + fileName)); 
      ftpReq.Method = WebRequestMethods.Ftp.UploadFile; 
      ftpReq.UsePassive = true; 
      ftpReq.UseBinary = true; 
      ftpReq.KeepAlive = true; 
      ftpReq.Credentials = new NetworkCredential(userName.Normalize(), password.Normalize()); 

      FileInfo fileInfo = new FileInfo(localFilePath + @"\" + fileName); 
      FileStream fileStream = fileInfo.OpenRead(); 

      byte[] fileContent = new byte[fileInfo.Length]; 
      fileStream.Read(fileContent, 0, Convert.ToInt32(fileInfo.Length)); 

      Stream writer = ftpReq.GetRequestStream(); 
      writer.Write(fileContent, 0, fileContent.Length); 
      fileStream.Close(); 
      writer.Close(); 
      FtpWebResponse response = (FtpWebResponse)ftpReq.GetResponse(); 

      AppendLogFile(response, "Uploaded Files: ", fileName); 
      MoveToArchive(file, archiveFilePath + fileName); 
     } 

    } 
    catch (Exception exception) 
    { 
     Console.WriteLine(exception.Message); 
    } 
} 

Надеется, что вы, ребята, можете мне помочь. благодаря!

EDIT: Я попытался это:

  string fileName = Path.GetFileName(file); 
      UriBuilder uri = new UriBuilder(); 
      uri.Scheme = "ftp"; 
      uri.Host = "my.server.no"; 
      uri.Port = 21; 
      uri.Path = "/home/username/tmp/"; 
      uri.UserName = "username"; 
      uri.Password = "password"; 
      FtpWebRequest ftpReq = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri.ToString() + fileName)); 
      ftpReq.Method = WebRequestMethods.Ftp.UploadFile; 
      ftpReq.UsePassive = true; 
      ftpReq.UseBinary = true; 
      ftpReq.KeepAlive = true; 
      ftpReq.Credentials = new NetworkCredential(userName.Normalize(), password.Normalize()); 

Это дает мне ту же ошибку ......

+0

Вы можете попытаться использовать сторонние компоненты, такие как http://www.enterprisedt.com/products/edtftpnet/ – Deffiss

+0

Что вы пытаетесь? Каково фактическое значение 'ftpServer + fileName', когда вы получаете ошибку? – CodeCaster

+0

'ftp: //my.server.no: 21/home/username/tmp/01002589006741.TXT' это значение ftpserver + filename. После использования UriBuilder это выглядит так. 'ftp: // имя пользователя: [email protected]: 21/home/имя пользователя/tmp/01002589006741.TXT' stille получает ту же ошибку .. – Lahib

ответ

2

я наконец-то нашел причину ошибки. Кажется, что сервер, который я пытался загрузить, был сервером linux. Я нашел описание в форуме о том, как исправить проблему. И это было написано на форуме:

Это может помочь FTP-серверу Linux.

Таким образом, серверы FTP Linux, в отличие от IIS, не имеют общего корневого каталога FTP. Вместо этого, когда вы входите на FTP-сервер под некоторыми учетными данными пользователя, этот корневой каталог этого пользователя используется. Таким образом, иерархия каталогов FTP начинается с/root/для пользователя root и из/home/username для других. Итак, если вам нужно запросить файл, не относящийся к домашнему каталогу учетной записи пользователя, но относительно корня файловой системы, добавьте дополнительный / после имени сервера. В результате URL будет выглядеть следующим образом:

ftp://servername.net//var/lalala

так, когда я изменил мою связь Uri от:

ftp://username:[email protected]:21/home/username/tmp/ 

к:

ftp://username:[email protected]:21//home/username/tmp/ 

(заметьте, что я добавил дополнительный / до /home/имя пользователя/tmp/)

тогда я работал!

+0

... спасибо, мужчина !!! – Serge

Смежные вопросы