it-swarm.com.de

FtpWebRequest Download-Datei

Der folgende Code soll eine Datei über FTP abrufen. Ich bekomme jedoch einen Fehler damit.

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

Der Fehler ist:

Der Remote-Server hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z. B. Datei nicht gefunden, kein Zugriff)

Die Datei existiert definitiv auf dem Remote-Computer und ich kann dieses FTP manuell ausführen (d. H. Ich habe Berechtigungen). Kann mir jemand sagen, warum ich diesen Fehler bekomme?

31
Paul Michaels

Dieser Absatz aus der FptWebRequest-Klassenreferenz könnte für Sie von Interesse sein:

Der URI kann relativ oder absolut sein . Wenn der URI die Form .__ hat. " ftp://contoso.com/%2fpath " (% 2f ist ein Escapezeichen '/'), dann ist der URI absolut und das aktuelle Verzeichnis ist /Pfad. Wenn jedoch der URI der .__ ist. Formular " ftp://contoso.com/path " zuerst Das .NET Framework meldet sich beim FTP an Server (unter Verwendung des Benutzernamens und des Kennworts ), das in der Eigenschaft Credentials festgelegt ist), dann das aktuelle Verzeichnis ist auf/Pfad gesetzt.

23
Frank Bollack

Ich weiß, dass dies ein alter Post ist, aber ich füge hier zum Nachschlagen hinzu. Hier ist eine Lösung, die ich gefunden habe:

    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", "[email protected]");
            byte[] fileData = request.DownloadData(ftpfullpath);

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

Auf der Grundlage eines ausgezeichneten Vorschlags von Ilya Kogan aktualisiert

45
Mark Kram

Einfachster Weg

Die einfachste Methode zum Herunterladen einer Binärdatei von einem FTP-Server mithilfe von .NET-Framework ist die Verwendung von 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");

Erweiterte Optionen

Verwenden Sie FtpWebRequest nur dann, wenn Sie eine umfassendere Kontrolle benötigen, die WebClient nicht anbietet (wie TLS/SSL-Verschlüsselung, Fortschrittsüberwachung usw.). Ein einfacher Weg ist es, einen FTP-Antwort-Stream mithilfe von Stream.CopyTo nach FileStream zu kopieren.

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

Fortschrittsüberwachung

Wenn Sie einen Download-Fortschritt überwachen müssen, müssen Sie den Inhalt nach Abschnitten selbst kopieren:

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

Informationen zum GUI-Fortschritt (WinForms ProgressBar) finden Sie unter:
FtpWebRequest FTP-Download mit ProgressBar


Ordner herunterladen

Wenn Sie alle Dateien von einem Remote-Ordner herunterladen möchten, lesen Sie
C # Laden Sie alle Dateien und Unterverzeichnisse über FTP herunter.

14
Martin Prikryl

Ich hatte das gleiche Problem!

Meine Lösung bestand darin, den Ordner public_html in die Download-URL einzufügen.

Realer Dateispeicherort auf dem Server:

myhost.com/public_html/myimages/image.png

Web URL:

www.myhost.com/myimages/image.png

2
Tom
    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;

    }

Ich hoffe es kann dir helfen.

2
Alingar Nwe Lay
   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
MORFEE89
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

Danach können Sie die folgende Zeile verwenden, um Fehler zu vermeiden. (Zugriff verweigert usw.)

request.Proxy = null;
0
user1770848