FtpWebRequest Скачать файл - PullRequest
33 голосов
/ 06 мая 2010

Следующий код предназначен для извлечения файла через FTP. Однако я получаю сообщение об ошибке.

serverPath = "ftp://x.x.x.x/tmp/myfile.txt";

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;

request.Method = WebRequestMethods.Ftp.DownloadFile;                
request.Credentials = new NetworkCredential(username, password);

// Read the file from the server & write to destination                
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) // Error here
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))            
using (StreamWriter destination = new StreamWriter(destinationFile))
{
    destination.Write(reader.ReadToEnd());
    destination.Flush();
}

Ошибка:

Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, файл не найден, нет доступа)

Файл определенно существует на удаленной машине, и я могу выполнить этот ftp вручную (т.е. у меня есть разрешения). Может кто-нибудь сказать мне, почему я могу получить эту ошибку?

Ответы [ 7 ]

49 голосов
/ 24 сентября 2011

Я знаю, что это старый пост, но я добавляю сюда для дальнейшего использования. Вот решение, которое я нашел:

    private void DownloadFileFTP()
    {
        string inputfilepath = @"C:\Temp\FileName.exe";
        string ftphost = "xxx.xx.x.xxx";
        string ftpfilepath = "/Updater/Dir1/FileName.exe";

        string ftpfullpath = "ftp://" + ftphost + ftpfilepath;

        using (WebClient request = new WebClient())
        {
            request.Credentials = new NetworkCredential("UserName", "P@55w0rd");
            byte[] fileData = request.DownloadData(ftpfullpath);

            using (FileStream file = File.Create(inputfilepath))
            {
                file.Write(fileData, 0, fileData.Length);
                file.Close();
            }
            MessageBox.Show("Download Complete");
        }
    }

Обновлено по превосходному предложению Ильи Когана

23 голосов
/ 06 мая 2010

Этот абзац из ссылки на класс FptWebRequest может представлять интерес для вас:

URI может быть относительным или абсолютным.Если URI имеет форму " ftp: //contoso.com/%2fpath" (% 2f является экранированным символом '/'), тогда URI является абсолютным, а текущий каталог - / path.Однако, если URI имеет форму « ftp: //contoso.com/path», сначала .NET Framework входит на FTP-сервер (используя имя пользователя и пароль, установленные свойством Credentials.), тогда текущим каталогом является /path.

15 голосов
/ 28 июня 2017

Самый простой способ

Самый простой способ загрузки двоичного файла с FTP-сервера с использованием .NET Framework - это использование WebClient.DownloadFile:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.DownloadFile(
    "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");

Дополнительные параметры

Используйте FtpWebRequest, только если вам нужен больший контроль, который WebClient не предлагает (например, шифрование TLS / SSL, мониторинг прогресса и т. Д.). Простой способ - просто скопировать поток ответов FTP на FileStream, используя Stream.CopyTo:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
    ftpStream.CopyTo(fileStream);
}

Мониторинг прогресса

Если вам нужно следить за ходом загрузки, вы должны скопировать содержимое по частям:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
    byte[] buffer = new byte[10240];
    int read;
    while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        fileStream.Write(buffer, 0, read);
        Console.WriteLine("Downloaded {0} bytes", fileStream.Position);
    }
}

Информация о прогрессе в графическом интерфейсе (WinForms ProgressBar) приведена в
FtpWebRequest FTP скачать с ProgressBar


Папка для скачивания

Если вы хотите загрузить все файлы из удаленной папки, см.
C # Загрузка всех файлов и подкаталогов через FTP .

2 голосов
/ 10 ноября 2016
    private static DataTable ReadFTP_CSV()
    {
        String ftpserver = "ftp://servername/ImportData/xxxx.csv";
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));

        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

        Stream responseStream = response.GetResponseStream();

        // use the stream to read file from FTP 
        StreamReader sr = new StreamReader(responseStream);
        DataTable dt_csvFile = new DataTable();

        #region Code
        //Add Code Here To Loop txt or CSV file
        #endregion

        return dt_csvFile;

    }

Надеюсь, это поможет вам.

2 голосов
/ 10 июля 2012

У меня была такая же проблема!

Моим решением было вставить папку public_html в URL-адрес загрузки.

Реальное расположение файла на сервере:

myhost.com / public_html / myimages / image.png

Веб-адрес:

www.myhost.com / myimages / image.png

0 голосов
/ 13 марта 2017
   public void download(string remoteFile, string localFile)
    {
       private string host = "yourhost";
       private string user = "username";
       private string pass = "passwd";
       private FtpWebRequest ftpRequest = null;
       private FtpWebResponse ftpResponse = null;
       private Stream ftpStream = null;
       private int bufferSize = 2048;

        try
        {
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);

            ftpRequest.Credentials = new NetworkCredential(user, pass);

            ftpRequest.UseBinary = true;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive = true;

            ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
            ftpStream = ftpResponse.GetResponseStream();

            FileStream localFileStream = new FileStream(localFile, FileMode.Create);

            byte[] byteBuffer = new byte[bufferSize];
            int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);

            try
            {
                while (bytesRead > 0)
                {
                    localFileStream.Write(byteBuffer, 0, bytesRead);
                    bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                }
            }

            catch (Exception) {  }

            localFileStream.Close();
            ftpStream.Close();
            ftpResponse.Close();
            ftpRequest = null;
        }

        catch (Exception) {  }
        return;
    }
0 голосов
/ 15 ноября 2012
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

После этого вы можете использовать следующую строку, чтобы избежать ошибки .. (доступ запрещен и т. Д.)

request.Proxy = null;
...