FtpWebRequest Télécharger Le Ficher

le code suivant est destiné à récupérer un fichier via FTP. Cependant, je reçois une erreur avec elle.

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();
}

l'erreur est:

le serveur distant a renvoyé une erreur: (550) fichier indisponible (par exemple, fichier non trouvé, pas d'accès)

le fichier existe certainement sur la machine distante et je suis capable d'effectuer ce ftp manuellement (i.e. j'ai des permissions). Quelqu'un peut-il me dire pourquoi je peut-être cette erreur?

27
demandé sur Martin Prikryl 2010-05-06 18:05:57

7 réponses

ce paragraphe du référence de classe FptWebRequest pourrait vous intéresser:

L'URI peut être relatif ou absolu. Si L'URI est de la forme " ftp://contoso.com/%2fpath " (%2f is un évadé '/'), alors L'URI est absolu, et le répertoire courant est /chemin. Si, toutefois, L'URI est la forme " ftp://contoso.com/path ", première l' .NET Framework se connecte au FTP serveur (en utilisant le nom d'utilisateur et mot de passe défini par les Pouvoirs de la propriété), puis le répertoire courant est /chemin d'accès.

21
répondu Frank Bollack 2010-05-06 14:20:59

je sais qu'il s'agit d'un ancien poste, mais j'ajoute ici pour référence future. Voici une solution que j'ai trouvée:

    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");
        }
    }

Updated based on excellent suggestion by Ilya Kogan

41
répondu Mark Kram 2013-06-25 18:37:47

la façon la plus triviale de télécharger un fichier binaire à partir D'un serveur FTP en utilisant .NET framework est d'utiliser 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");

Use FtpWebRequest , seulement si vous avez besoin d'un plus grand contrôle, que WebClient n'offre pas (comme le cryptage TLS/SSL, la surveillance de progrès etc). La manière simple est de simplement copier un flux de réponse FTP vers FileStream en utilisant 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);
}

si vous avez besoin de surveiller la progression d'un téléchargement, Vous devez copier le contenu par morceaux vous-même:

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);
    }
}

pour GUI progress (WinForms ProgressBar ), voir:

FtpWebRequest FTP download with ProgressBar

si vous voulez télécharger tous les fichiers d'un dossier distant, voir

c# télécharger tous les fichiers et sous-répertoires par FTP .

10
répondu Martin Prikryl 2018-08-21 06:56:54

j'ai eu le même problème!

ma solution était d'insérer le dossier public_html dans L'URL de téléchargement.

emplacement du fichier réel sur le serveur:

myhost.com/public_html/myimages/image.png

Web URL:

www.myhost.com/myimages/image.png

2
répondu Tom 2012-07-10 21:55:33
    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;

    }

j'espère que cela pourra vous aider.

1
répondu Alingar Nwe Lay 2016-11-10 10:14:32
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

après cela, vous pouvez utiliser la ligne ci-dessous pour éviter l'erreur..(accès refusé etc.)

request.Proxy = null;
0
répondu user1770848 2012-11-15 16:43:22
   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
répondu MORFEE89 2017-03-13 19:08:40