IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de téléchargement d'un fichier via FTP


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut Problème de téléchargement d'un fichier via FTP
    Bonjour,

    J'essaye de télécharger un fichier sur un serveur via FTP dans C# et cela ne fonctionne pas tout à fait car il semble y avoir un problème d'encodage du fichier téléchargé.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    string inputfilepath = @"C:\Temp\S102.ETACT";
    string ftphost = "monHote"; 
    string ftpfilepath = "/S102.ETACT";
     
    string ftpfullpath = "ftp://" + ftphost + ftpfilepath;
     
    WebClient request = new WebClient();
    request.Credentials = new NetworkCredential("user", "psw");
    request.Encoding = Encoding.ASCII;
     
    byte[] fileData = request.DownloadData(ftpfullpath);
     
    FileStream file = File.Create(inputfilepath);
    file.Write(fileData, 0, fileData.Length);
    file.Close();
    Cela me donne un fichier avec des caractères non-lisibles et pourtant, si j'utilise FileZilla pour télécharger le fichier et que je spécifie que le transfert doit se faire en ASCII, tout est parfait sur le fichier téléchargé.

    J'ai aussi essayé de convertir le fichier seulement après le téléchargement en utilisant string fileString = Encoding.ASCII.GetString(fileData). J'ai aussi essayé de lire le fichier en utilisant byte[] fileData = File.ReadAllBytes(ftpfullpath) sans plus de succès.

    Est-ce que vous auriez une piste de solution pour moi?

    Merci de votre aide!

  2. #2
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Au début tu doit télécharger ton fichier et tu le met soit en mémoire soit sur le disque physiquement.
    Ensuite tu essaye de lire ton fichier avec l'encodage par défaut de fichier.
    (Je vois que tu n'attend pas le téléchargement de fichier tu doit télécharger ton fichier avant tt)

  3. #3
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    voila un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     // Get the object used to communicate with the server.
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm");
                request.Method = WebRequestMethods.Ftp.DownloadFile;
     
                // This example assumes the FTP site uses anonymous logon.
                request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");
     
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
     
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                Console.WriteLine(reader.ReadToEnd());
     
                Console.WriteLine("Download Complete, status {0}", response.StatusDescription);
     
                reader.Close();
                response.Close();

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu confonds 2 choses : le mode de transfert FTP (binaire ou ASCII) et l'encodage du texte (request.Encoding).

    Le mode de transfert ASCII porte assez mal son nom, car en fait les données ne sont pas forcément en ASCII ; c'est juste que les retours chariots sont convertis vers ceux de la plateforme qui reçoit le fichier (\n sous Unix, \r\n sous Windows)

    L'encodage ASCII, par contre, concerne la représentation binaire des caractères ; le "vrai" ASCII ne supporte que 127 caractères, tout ce qui dépasse est considéré comme "caractère inconnu". Donc en gros, en disant au WebClient d'utiliser l'encodage ASCII, tu l'empêches de gérer correctement les caractères qui ne font pas partie du jeu ASCII.

    A priori la classe WebClient ne permet pas de contrôler si le transfert se fait en mode binaire ou en mode ASCII ; pour ça il faut utiliser la classe FtpWebRequest, et mettre la propriété UseBinary à false.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var request = (FtpWebRequest)WebRequest.Create(ftpfullpath);
    request.UseBinary = false;
    request.Credentials = new NetworkCredential("user", "psw");
    using (var response = request.GetResponse())
    using (var ftpStream = response.GetResponseStream())
    using (var fileStream = File.OpenWrite(localFilePath))
    {
        ftpStream.CopyTo(fileStream);
    }
    Cela dit, est-ce que tu as vraiment besoin d'utiliser le mode ASCII ? La plupart des programmes aujourd'hui gèrent correctement les différents types de retour chariot, donc ça n'a plus beaucoup de sens de faire cette conversion au niveau du transfert. La plupart du temps le mode binaire est plus adapté, et au moins tu es sûr que le fichier est transféré "tel quel", sans modification.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Super ca fonctionne!!!

    Merci Tomlev pour la réponse très claire et les explications sur pourquoi ma façon de faire ne fonctionnait pas!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2014, 15h18
  2. [PHP 5.0] Téléchargement de fichier via FTP
    Par valentin1991 dans le forum Langage
    Réponses: 3
    Dernier message: 18/06/2014, 08h43
  3. Upload de fichier via FTP / OpenFileDialog
    Par Pokerstar dans le forum VB.NET
    Réponses: 2
    Dernier message: 18/05/2007, 03h34
  4. [applet ]envoyer fichier via ftp? quelle solution?
    Par chouchou93 dans le forum Applets
    Réponses: 5
    Dernier message: 27/03/2006, 15h35
  5. []transfert de fichiers via FTP
    Par ista9im dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/10/2005, 23h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo