Laden Sie die Datei mit C # auf FTP hoch

112

Ich versuche eine Datei mit C # auf einen FTP-Server hochzuladen. Die Datei wird hochgeladen, jedoch mit null Bytes.

private void button2_Click(object sender, EventArgs e)
{
    var dirPath = @"C:/Documents and Settings/sander.GD/Bureaublad/test/";

    ftp ftpClient = new ftp("ftp://example.com/", "username", "password");

    string[] files = Directory.GetFiles(dirPath,"*.*");

    var uploadPath = "/httpdocs/album";

    foreach (string file in files)
    {
        ftpClient.createDirectory("/test");

        ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file);
    }

    if (string.IsNullOrEmpty(txtnaam.Text))
    {
        MessageBox.Show("Gelieve uw naam in te geven !");
    }
}
Webvision
quelle
18
Warum funktionieren die ursprünglichen FTP-Anmeldeinformationen fast zwei Jahre später immer noch?
FreeAsInBeer
1
Mögliches Duplikat der Upload-Datei auf FTP
Frédéric
Könnten Sie versuchen, was in der Frage @Frederic erwähnt ist, die verlinkt ist, und zurückkommen ... außerdem ist nicht klar, welche API Sie für den FTP-Upload verwenden ...
Deostroll

Antworten:

272

Die vorhandenen Antworten sind gültig, aber warum das Rad neu erfinden und sich mit WebRequestTypen niedrigerer Ebenen beschäftigen , während WebClientdas Hochladen von FTP bereits ordentlich implementiert wird:

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
}
Saeb Amini
quelle
39
Nur ein Cent: Sie können die magische Zeichenfolge "STOR" für WebRequestMethods.Ftp.UploadFile ersetzen
Klicken
Leider scheint es keine Möglichkeit zu geben, mit WebClient ein neues Verzeichnis zum Hochladen einer Datei zu erstellen.
Danludwig
1
PSA: Webrequest wird nicht mehr empfohlen, dies sind jetzt die offiziellen Alternativen
Pacharrin
Hallo, was zeigt path.zip in der UploadFile-Methode an? Muss ich einen Dateinamen nach dem Hostnamen einfügen? Ich habe nur eine TXT-Datei zum Senden. Ich dachte, Dateiname und Pfad zu dieser Datei werden in localFile erwähnt.
Skanda
42
public void UploadFtpFile(string folderName, string fileName)
{

    FtpWebRequest request;

    string folderName; 
    string fileName;
    string absoluteFileName = Path.GetFileName(fileName);

    request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", "127.0.0.1", folderName, absoluteFileName))) as FtpWebRequest;
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = 1;
    request.UsePassive = 1;
    request.KeepAlive = 1;
    request.Credentials =  new NetworkCredential(user, pass);
    request.ConnectionGroupName = "group"; 

    using (FileStream fs = File.OpenRead(fileName))
    {
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        fs.Close();
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Flush();
        requestStream.Close();
    }
}

Wie benutzt man

UploadFtpFile("testFolder", "E:\\filesToUpload\\test.img");

Verwenden Sie dies in Ihrem Foreach

und Sie müssen nur einmal einen Ordner erstellen

um einen Ordner zu erstellen

request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/", "127.0.0.1", "testFolder"))) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)request.GetResponse();
cdev
quelle
3
Die Antwort verpasst einen Anruf an request.GetResponse(). Ohne diese Funktion funktioniert der Upload auf einigen Servern (zu Recht) nicht. Siehe Gewusst wie: Hochladen von Dateien mit FTP .
Martin Prikryl
Ich bin versucht, -1 zu nehmen, weil ich lautlos Ausnahmen verschluckt habe. Können Sie bitte diesen schädlichen Try-Catch-Block entfernen?
Heinzi
32

Einfachster Weg

Die einfachste Möglichkeit, eine Datei mit .NET Framework auf einen FTP-Server hochzuladen, ist die folgende WebClient.UploadFileMethode :

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

Erweiterte Optionen

Wenn Sie eine bessere Kontrolle benötigen, die WebClientdiese nicht bietet (wie TLS / SSL-Verschlüsselung , ASCII-Modus, aktiver Modus usw.), verwenden Sie FtpWebRequest. Ein einfacher Weg ist, einen FileStreamin einen FTP-Stream zu kopieren , indem Sie 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.UploadFile;  

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

Fortschrittsüberwachung

Wenn Sie den Upload-Fortschritt überwachen müssen, müssen Sie den Inhalt selbst in Blöcke kopieren:

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

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

Informationen zum GUI-Fortschritt (WinForms ProgressBar) finden Sie im C # -Beispiel unter :
Wie können wir den Fortschrittsbalken für das Hochladen mit FtpWebRequest anzeigen?


Ordner hochladen

Wenn Sie alle Dateien aus einem Ordner hochladen möchten,
lesen Sie Upload des Dateiverzeichnisses mit WebClient auf den FTP-Server .

Informationen zum rekursiven Hochladen finden Sie unter
Rekursives Hochladen auf den FTP-Server in C #

Martin Prikryl
quelle
10

Folgendes funktioniert für mich:

public virtual void Send(string fileName, byte[] file)
{
    ByteArrayToFile(fileName, file);

    var request = (FtpWebRequest) WebRequest.Create(new Uri(ServerUrl + fileName));

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UsePassive = false;
    request.Credentials = new NetworkCredential(UserName, Password);
    request.ContentLength = file.Length;

    var requestStream = request.GetRequestStream();
    requestStream.Write(file, 0, file.Length);
    requestStream.Close();

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

    if (response != null)
        response.Close();
}

Sie können den Dateiparameter in Ihrem Code nicht lesen, da es sich nur um den Dateinamen handelt.

Verwenden Sie Folgendes:

byte[] bytes = File.ReadAllBytes(dir + file);

Um die Datei zu erhalten, können Sie sie an die SendMethode übergeben.

Björn Mårtensson
quelle
Hallo, ich habe einen Ordner mit Dateien. Wie kann ich ihn einfach auf einen FTP-Server hochladen? Dieser Code Ich weiß nicht genau, wie das funktioniert?
Webvision
Rufen Sie in foreach loop diese Methode mit der entsprechenden Eingabe auf.
nRk
8
public static void UploadFileToFtp(string url, string filePath, string username, string password)
{
    var fileName = Path.GetFileName(filePath);
    var request = (FtpWebRequest)WebRequest.Create(url + fileName);

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(username, password);
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;

    using (var fileStream = File.OpenRead(filePath))
    {
        using (var requestStream = request.GetRequestStream())
        {
            fileStream.CopyTo(requestStream);
            requestStream.Close();
        }
    }

    var response = (FtpWebResponse)request.GetResponse();
    Console.WriteLine("Upload done: {0}", response.StatusDescription);
    response.Close();
}
Christian Moser
quelle
Warum setzen Sie KeepAlive = false? Sind Sie sicher, dass requestStream.Close () erforderlich ist? Sie verwenden requestStream im Inneren mit, also denke ich, dass es den Stream von selbst schließen wird.
Kate
2

Im ersten Beispiel müssen diese geändert werden in:

requestStream.Flush();
requestStream.Close();

Erst spülen und danach schließen.

Marik
quelle
1

Dies funktioniert bei mir. Mit dieser Methode wird eine Datei per SFTP an einen Speicherort in Ihrem Netzwerk gesendet. Es verwendet die Bibliothek SSH.NET.2013.4.7. Man kann sie einfach kostenlos herunterladen.

    //Secure FTP
    public void SecureFTPUploadFile(string destinationHost,int port,string username,string password,string source,string destination)

    {
        ConnectionInfo ConnNfo = new ConnectionInfo(destinationHost, port, username, new PasswordAuthenticationMethod(username, password));

        var temp = destination.Split('/');
        string destinationFileName = temp[temp.Count() - 1];
        string parentDirectory = destination.Remove(destination.Length - (destinationFileName.Length + 1), destinationFileName.Length + 1);


        using (var sshclient = new SshClient(ConnNfo))
        {
            sshclient.Connect();
            using (var cmd = sshclient.CreateCommand("mkdir -p " + parentDirectory + " && chmod +rw " + parentDirectory))
            {
                cmd.Execute();
            }
            sshclient.Disconnect();
        }


        using (var sftp = new SftpClient(ConnNfo))
        {
            sftp.Connect();
            sftp.ChangeDirectory(parentDirectory);
            using (var uplfileStream = System.IO.File.OpenRead(source))
            {
                sftp.UploadFile(uplfileStream, destinationFileName, true);
            }
            sftp.Disconnect();
        }
    }
C.Poh
quelle
Diese Antwort scheint die einzige Lösung für mein SFTP zu sein. Ich warte darauf, es zu testen.
Olorunfemi Ajibulu
1

Veröffentlichungsdatum: 26.06.2008

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
    public class WebRequestGetExample
    {
    public static void Main ()
    {
        // Get the object used to communicate with the server.
        FtpWebRequest request = 
(FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm");
        request.Method = WebRequestMethods.Ftp.UploadFile;

        // This example assumes the FTP site uses anonymous logon.
        request.Credentials = new NetworkCredential("anonymous", 
"[email protected]");

        // Copy the contents of the file to the request stream.
        byte[] fileContents;
        using (StreamReader sourceStream = new StreamReader("testfile.txt"))
        {
            fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
        }

        request.ContentLength = fileContents.Length;

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(fileContents, 0, fileContents.Length);
        }

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            Console.WriteLine($"Upload File Complete, status 
{response.StatusDescription}");
        }
    }
}
}
Uzay
quelle
0

Ich habe beobachtet, dass -

  1. FtpwebRequest fehlt.
  2. Da das Ziel FTP ist, ist das NetworkCredential erforderlich.

Ich habe eine Methode vorbereitet, die so funktioniert. Sie können den Wert der Variablen ftpurl durch den Parameter TargetDestinationPath ersetzen. Ich hatte diese Methode in einer Winforms-Anwendung getestet:

private void UploadProfileImage(string TargetFileName, string TargetDestinationPath, string FiletoUpload)
        {
            //Get the Image Destination path
            string imageName = TargetFileName; //you can comment this
            string imgPath = TargetDestinationPath; 

            string ftpurl = "ftp://downloads.abc.com/downloads.abc.com/MobileApps/SystemImages/ProfileImages/" + imgPath;
            string ftpusername = krayknot_DAL.clsGlobal.FTPUsername;
            string ftppassword = krayknot_DAL.clsGlobal.FTPPassword;
            string fileurl = FiletoUpload;

            FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl);
            ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword);
            ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
            ftpClient.UseBinary = true;
            ftpClient.KeepAlive = true;
            System.IO.FileInfo fi = new System.IO.FileInfo(fileurl);
            ftpClient.ContentLength = fi.Length;
            byte[] buffer = new byte[4097];
            int bytes = 0;
            int total_bytes = (int)fi.Length;
            System.IO.FileStream fs = fi.OpenRead();
            System.IO.Stream rs = ftpClient.GetRequestStream();
            while (total_bytes > 0)
            {
                bytes = fs.Read(buffer, 0, buffer.Length);
                rs.Write(buffer, 0, bytes);
                total_bytes = total_bytes - bytes;
            }
            //fs.Flush();
            fs.Close();
            rs.Close();
            FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse();
            string value = uploadResponse.StatusDescription;
            uploadResponse.Close();
        }

Lassen Sie mich im Falle eines Problems wissen, oder hier ist ein weiterer Link, der Ihnen helfen kann:

https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx

Kshitij Jhangra
quelle