Télécharger le fichier sur FTP en utilisant C #

112

J'essaye de télécharger un fichier sur un serveur FTP avec C #. Le fichier est téléchargé mais avec zéro octet.

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
la source
18
Pourquoi presque 2 ans plus tard, les informations d'identification FTP d'origine fonctionnent-elles toujours?
FreeAsInBeer
1
duplicata possible de Upload file sur ftp
Frédéric
Pourriez-vous essayer ce qui est mentionné dans la question @Frederic lié à et revenir ... de plus, il n'est pas clair quelle api vous utilisez pour le téléchargement ftp ...
deostroll

Réponses:

272

Les réponses existantes sont valides, mais pourquoi réinventer la roue et s'embêter avec des WebRequesttypes de niveau inférieur tout en WebClientimplémentant déjà le téléchargement FTP proprement:

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
}
Saeb Amini
la source
39
Juste un centime: vous pouvez remplacer la chaîne magique "STOR" pour WebRequestMethods.Ftp.UploadFile
Cliquez sur Ok
Malheureusement, il ne semble pas y avoir de moyen d'utiliser WebClient pour créer un nouveau répertoire vers lequel télécharger un fichier.
danludwig
1
PSA: webrequest n'est plus recommandé, ce sont maintenant les alternatives officielles
Pacharrin
Bonjour, qu'indique path.zip dans la méthode UploadFile? Ai-je besoin d'un nom de fichier à inclure après le nom d'hôte? J'ai juste un fichier txt à envoyer, je pensais que le nom du fichier et le chemin d'accès à ce fichier étaient mentionnés dans localFile.
Skanda
43
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();
    }
}

Comment utiliser

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

utilisez ceci dans votre foreach

et vous n'avez besoin de créer un dossier qu'une seule fois

pour créer un dossier

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
la source
3
La réponse manque un appel à request.GetResponse(). Sans cela, le téléchargement ne fonctionnera pas (à juste titre) sur certains serveurs. Consultez Comment: télécharger des fichiers avec FTP .
Martin Prikryl
Je suis tenté de -1 pour avaler silencieusement des exceptions. Pouvez-vous s'il vous plaît supprimer ce bloc try-catch nuisible?
Heinzi
33

Le moyen le plus simple

Le moyen le plus simple de télécharger un fichier sur un serveur FTP à l'aide de .NET Framework consiste à utiliser la WebClient.UploadFileméthode :

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

Options avancées

Si vous avez besoin d'un plus grand contrôle, qui WebClientn'offre pas (comme le cryptage TLS / SSL , le mode ASCII, le mode actif, etc.), utilisez FtpWebRequest. Un moyen simple est de simplement copier un FileStreamdans un flux FTP 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.UploadFile;  

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

Suivi des progrès

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

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

Pour la progression de l'interface graphique (WinForms ProgressBar), voir l'exemple C # à l' adresse :
Comment pouvons-nous afficher la barre de progression pour le téléchargement avec FtpWebRequest


Téléchargement du dossier

Si vous souhaitez télécharger tous les fichiers d'un dossier, voir
Télécharger le répertoire des fichiers sur le serveur FTP à l'aide de WebClient .

Pour un téléchargement récursif, consultez
Téléchargement récursif vers un serveur FTP en C #

Martin Prikryl
la source
10

Ce qui suit fonctionne pour moi:

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

Vous ne pouvez pas lire envoyer le paramètre de fichier dans votre code car il ne s'agit que du nom de fichier.

Utilisez le suivant:

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

Pour obtenir le fichier afin de pouvoir le transmettre à la Sendméthode.

Björn Mårtensson
la source
bonjour, j'ai un dossier contenant des fichiers .. comment puis-je simplement le télécharger sur un serveur FTP? Ce code, je ne sais pas exactement comment cela fonctionne?
webvision
dans la boucle foreach, appelez cette méthode avec l'entrée appropriée.
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
la source
pourquoi définissez-vous KeepAlive = false? Êtes-vous sûr qu'il est nécessaire de requestStream.Close ()? Vous utilisez requestStream à l'intérieur, donc je pense qu'il fermera le flux par lui-même.
Kate le
2

Dans le premier exemple, vous devez les changer en:

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

Premier rinçage et après cette fermeture.

marik
la source
1

Cela fonctionne pour moi, cette méthode va SFTP un fichier vers un emplacement au sein de votre réseau. Il utilise la bibliothèque SSH.NET.2013.4.7. On peut simplement le télécharger gratuitement.

    //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
la source
Cette réponse semble être la seule solution pour mon sftp. En attendant de le tester.
Olorunfemi Ajibulu
1

date de publication: 26/06/2018

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
la source
0

J'ai observé que -

  1. FtpwebRequest est manquant.
  2. Comme la cible est FTP, le NetworkCredential est requis.

J'ai préparé une méthode qui fonctionne comme ceci, vous pouvez remplacer la valeur de la variable ftpurl par le paramètre TargetDestinationPath. J'avais testé cette méthode sur l'application winforms:

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

Faites-moi savoir en cas de problème, ou voici un autre lien qui peut vous aider:

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

Kshitij Jhangra
la source