2017-01-03 4 views
1

Я пытаюсь загрузить файл в папку FTP, но получаю следующую ошибку.Загрузка файлов в папку ftp со специальными символами в имени

The remote server returned an error: (550) File unavailable (e.g., file not found, no access)

Я использую следующий образец, чтобы проверить это:

// Get the object used to communicate with the server. 
    string path = HttpUtility.UrlEncode("ftp://host:port//01-03-2017/John, Doe S. M.D/file.wav"); 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(path); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

    // This example assumes the FTP site uses anonymous logon. 
    request.Credentials = new NetworkCredential("user", "password"); 

    // Copy the contents of the file to the request stream. 
    StreamReader sourceStream = new StreamReader(@"localpath\example.wav"); 
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
    sourceStream.Close(); 
    request.ContentLength = fileContents.Length; 

    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(fileContents, 0, fileContents.Length); 
    requestStream.Close(); 

    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

    Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); 

    response.Close(); 
  • Я могу загрузить файлы на родительской папке 01-03-2017 но не в целевой папке ROLLINS, SETH S. M.D, которая явно имеет специальные символы Это.
  • Я могу загрузить файлы с помощью FileZilla
  • Я пытался HttpUtility.UrlEncode, но это не помогло

Спасибо за ваше время и помощь.

+0

Проблема с URL: используйте «//» после каждого имени папки вместо «/» @Ankit – Prabu

ответ

2

использовать что-то вроде этого:

string path = HttpUtility.UrlEncode("ftp://96.31.95.118:2121//01-03-2017//ROLLINS, SETH S. M.D//30542_3117.wav"); 

или Вы можете сформировать Uri, используя следующий код и передать его WebRequest.

var path = new Uri("ftp://96.31.95.118:2121//01-03-2017//ROLLINS, SETH S. M.D//30542_3117.wav"); 
+0

Это даст вам «ftp% 3a% 2f% 2f96.31.95.118% 3a2121% 2f% 2f01- 03-2017% 2f% 2fROLLINS% 2c + СЕТ + S + MD% 2f% 2f30542_3117.wav'. Это не похоже на правильный путь (даже если это работает случайно). –

+0

@MartinPrikryl, Да, это решение неверно. Мой комментарий неуместен и должен был после комментария Прабху по этому вопросу. – Ankit

2

Вы должны кодировать пространства (и, может быть, запятые) в URL-путь, как:

string path = 
    "ftp://host:port/01-03-2017/" + 
    HttpUtility.UrlEncode("John, Doe S. M.D") + "/file.wav"; 

эффективно, вы получите:

ftp://host:port/01-03-2017/John%2c+Doe+S.+M.D/file.wav 
2

Код работает на C# консольное приложение, но не работало в Web Api Action. Мне не удалось найти причину.

Так что я использовал бесплатную библиотеку для нее.

Проводка образца кода одного из доступных here примеров:

Так я использовал FluentFtp libary доступный через Nuget.

using System; 
using System.IO; 
using System.Net; 
using FluentFTP; 

namespace Examples { 
    public class OpenWriteExample { 
     public static void OpenWrite() { 
      using (FtpClient conn = new FtpClient()) { 
       conn.Host = "localhost"; 
       conn.Credentials = new NetworkCredential("ftptest", "ftptest"); 

       using (Stream ostream = conn.OpenWrite("01-03-2017/John, Doe S. M.D/file.wav")) { 
        try { 
         // istream.Position is incremented accordingly to the writes you perform 
        } 
        finally { 
         ostream.Close(); 
        } 
       } 
      } 
     } 
    } 
} 

Опять же, если файл является двоичным файлом, StreamReader should not be used, как описано здесь.

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

  • Нет связанных вопросов^_^