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

Delphi Discussion :

Envoyer un fichier sur un serveur FTP en Delphi 10


Sujet :

Delphi

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 68
    Points
    68
    Par défaut Envoyer un fichier sur un serveur FTP en Delphi 10
    Bonjour,

    J'ai une application Delphi 10 dans laquelle, entre autre, je génère un fichier texte. Je veux simplement envoyer le fichier sur un serveur ftp distant. Je n'ai pas besoin de coller un composant sur la page de conception, cela doit être transparent pour l'utilisateur.
    J'ai essayé trois méthodes que je n'arrive pas à finaliser :
    1) La plus rustique Winexec, qui fonctionne presque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    InstructionsFTP(NomFichierEcrit,Chemin);
    CommandeDos := PAnsiChar(AnsiString('ftp -i -s:'+ Chemin+'instruction.txt')) ;
     
    Winexec(CommandeDos,SW_NORMAL); }
    Avec
    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
    18
     
    procedure InstructionsFTP (Fichier, Chemin : string);
     
    var
        tx:Textfile;
     
    begin
        AssignFile(tx,Chemin + 'instruction.txt');    {}
     
         ReWrite(tx);
          WriteLn(tx, 'OPEN xxxxxxx.org' );
           WriteLn(tx, 'nom utilisateur' );
           WriteLn(tx, 'motpasse' );
             WriteLn(tx, 'ascii' ); 
            WriteLn(tx, 'put  '+ Fichier );
           {WriteLn(tx, 'bye' );}
        CloseFile(tx);  
    end;
    et j'obtiens cela dans la fenêtre DOS :


    ftp> OPEN xxxxxxxx.org
    Connecté à xxxxxxx.org.
    220 Bienvenue sur xxxxxxx de 123.fr
    200 Always in UTF8 mode.
    Utilisateur (xxxxxxxxxx: (none)) :
    331 Please specify the password.

    230 Login successful.
    ftp> ascii
    200 Switching to ASCII mode.
    ftp> put C:\Users\............\monfichiertexte.txt
    200 PORT command successful. Consider using PASV.
    425 Failed to establish connection.
    ftp>


    Cela à fonctionner instantanément jusqu'à la ligne 200 PORT .... comprise, puis cela à mouliner pas mal de temps avant l'affichage de la ligne 425 ....
    Evidemment il s'est bien créé un fichier monfichiertexte.txt sur le serveur ftp mais de 0 octet !

    2) Je sais que winexec est obsolète mais pour quelques lignes de codes...

    J'ai essayé ShellExecute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InstructionsFTP(NomFichierEcrit,Chemin);
     CommandeDos2 := PChar(AnsiString('ftp -i -s:'+ Chemin+'instruction.txt')) ; }
     ShellExecute(Handle, 'Open' ,CommandeDos2 , pchar(''), 0, SW_NORMAL);
    J'ai bien mis ShellAPI dans le uses, mais là il ne se passe rien du tout. Pas de fenêtre Dos qui s'ouvre, rien sur le serveur ftp, et pas de message d'erreur, ni d'erreur d'exécution

    3) J'ai voulu essayer Indy en ajoutant un composant sur la page de conception, quitte à ne pas l'afficher.
    Je vais sur la palette d'outils dans le répertoire IndyClient et j'essaie de coller l'icône TIdFTP, mais j'ai en retour le message suivant :

    Nom : copiecran.jpg
Affichages : 945
Taille : 25,1 Ko

    Si vous avez une solution pour une de ces 3 méthodes, je vous en remercie d'avance.

    Léo

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par leomath Voir le message
    Je veux simplement envoyer le fichier sur un serveur ftp distant. Je n'ai pas besoin de coller un composant sur la page de conception, cela doit être transparent pour l'utilisateur.
    Bonjour,

    Je ne comprends pas bien cette phrase... Les composants non visuels ne sont pas par définition pas visibles de l'utilisateur.
    Je pense que la solution la plus simple est d'utiliser les composants Indy fourni avec Delphi. Je ne rencontre pas votre problème. C'est curieux : n'auriez vous pas 2 packages Indy installés ?

    Avec un TIdFTP sur votre fiche, saisissez quelque chose du style suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.ChargerFichierFTP(fichierSource, repDest : string);
    begin
      idFTP1.Host := 'monServeurFTP';
      idFTP1.Username := 'utilisateur';
      idFTP1.password := 'motDePasse';
      idFTP1.Connect;
      idFTP1.changeDir(repDest);
      idFTP1.Put(fichierSource,ExtractFileName(fichierSource));
      idFTP1.Quit;
      idFTP1.Disconnect;
    end;
    Exemple d'appel de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChargerFichierFTP('c:\temp\monfichier.txt', 'fichiers'):
    Le fichier "c:\temp\monfchier.txt" sera chargé dans le sous répertoire "fichiers" du répertoire home de l'"utilisateur" sur le serveur "monServeurFTP".
    Les composants Indy fonctionnent en VCL et en Firemonkey.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Delphi 10 après avoir lu le message d'erreur indy (xxxxx230.) je suppose qu'il s'agit de Delphi Seattle 10.x une chance je ne l'ai pas encore supprimé de mon PC !

    J'ai même plusieurs programmes utilisant Indy (bien que pas de Idftp) et n'ai jamais eu de soucis avec. Donc en ce qui concerne votre EDI c'est certainement un problème d'installation Indy ou de chemin de recherche.

    Maintenant, rien ne vous empêche de créer un idFTP au runtime,

    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
    18
    19
     
    uses ...  
    IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ...
     
    ...
     
    var 
      IdFTP1: TIdFTP;
    ...
      IdFTP1 := TIdFTP.create(nil);
      try
      ...  // remplir les propriétés
           // connecter
           // faire le transfert 
           // déconnecter
      finally
        IdFTP1.Free;
      end;
    end;
    N.B. il y a aussi les composants ICS que vous pouvez obtenir via Getit
    voici un code qui va avec
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    uses
      ...
      OverbyteIcsFtpCli;
     
    procedure FtpUploadFile( 
                                 HostName: String; 
                                 UserName: String; 
                                 Password: String; 
                                 UploadFileName: String; 
                                 ToHostDir : String );
    var
      FTP: TFtpClient;
    begin
      FTP := TFtpClient.Create(nil);
      try
        FTP.HostName := HostName;
        FTP.Passive := True;
        FTP.Binary := True;
        FTP.Username := UserName;
        FTP.Password := Password;
        FTP.Port := '21';
     
        if not FTP.Open then
          raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);
     
        if (not FTP.User) or (not FTP.Pass) then 
          raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);
     
        FTP.HostDirName := ToHostDir;
        if not FTP.Cwd then
          raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
     
        FTP.LocalFileName := UploadFileName;
        FTP.HostFileName := ExtractFileName(UploadFileName);
     
        if not FTP.Put then
          raise Exception.Create('Failed to upload file: ' + FTP.ErrorMessage);
      finally
        FTP.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       FtpLoadFile('monsite.com',  
                         '******', '******',
                         IncludeTrailingPathDelimiter( 
                              ExtractFilePath(Application.ExeName) ) +'datafile.zip',
                         '/files'  );
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 68
    Points
    68
    Par défaut
    Bonjour Sergio,

    C'est bien Delphi 10 Seattle que j'ai.
    Je vais essayer votre code, sans essayer de passer par la palette d'outils.
    Je ne sais pas vraiment si Indy est bien installé. IndyClient figure bien dans la palette d'outils et voilà le chemin C:\Program Files (x86)\Embarcadero\Studio\17.0\source\Indy10.

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 68
    Points
    68
    Par défaut
    Bonjour gbegreg,

    Merci de votre réponse.
    J'ai vu votre message après celui de Sergio.
    Je ne sais pas si j'ai 2 packages Indy installés. Je ne sais pas faire.
    Quand je parlais de composant visible, je ne savais pas si le TIDFTP est visible ou pas car je n'ai pas réussi à le coller sur ma fiche.

    Léo

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 68
    Points
    68
    Par défaut
    Bonjour Sergio,

    J'ai copié et adapté ton code avec les uses adéquates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IdFTP1 := TIdFTP.create(nil);
                  try
                     IdFTP1.Host :=' xxxxxxx.org';
                     IdFTP1.Username :=' xxxxxxxx'; 
                     IdFTP1.Password := 'xxxxxxxxx'; 
                     IdFTP1.Connect;
                     IdFTP1.put(NomFichierEcrit) ; 
     
                  finally
                    IdFTP1.Free;
                  end;
    J'ai lancé Exécuter. Pas de problème à la compilation ni à l'exécution jusqu'au transfert. Cela s'est mis à mouliner avant de planter avec le message

    Nom : copiecran2.jpg
Affichages : 1666
Taille : 25,1 Ko

    Sur le serveur FTP il y a bien un fichier qui s'est écrit avec le bon nom mais avec 0 octet, comme avec Winexec ..
    D'où vient l'erreur ?

    J'ai voulu essayer aussi avec OverbyteIcsFtpCli mais apparemment il n'est pas installé sur mon ordi. A la compilation il détecte l'erreur dès le uses.
    Merci encore.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Pas de problème à la compilation ni à l'exécution jusqu'au transfert. Cela s'est mis à mouliner avant de planter
    Sur le serveur FTP il y a bien un fichier qui s'est écrit avec le bon nom mais avec 0 octet, comme avec Winexec
    problème d'autorisation auth, de protocole SSL, de type de fichier (par défaut ASCII) ? cela dépend beaucoup du serveur ftp.

    Mais je pense que la syntaxe du put est insuffisante, j'ai indy 10.6, la syntaxe du put
    Put(AStream :Stream;ADestfile : String,AAppend: Boolean;AStartpos: int64)

    à minima il faut donc quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idFTP1.Put(NomFichierEcrit, ExtractFileName(NomFichierEcrit));
    des démos de indy se trouvent ici : http://www.indyproject.org/sockets/demos/index.en.aspx


    J'ai voulu essayer aussi avec OverbyteIcsFtpCli mais apparemment il n'est pas installé sur mon ordi. A la compilation il détecte l'erreur dès le uses.
    il faut le télécharger et l'installer via l'utilitaire Getit (Outils/gestionnaires de paquets Getit)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 68
    Points
    68
    Par défaut
    Bonjour Sergio,

    C'était un problème de pare-feu. J'ai changé d'ordi où la gestion du pare-feu est plus simple et cela fonctionne.
    La syntaxe simple du put fonctionne donc. On peut effectivement dans le put mettre deux noms des fichiers : origine et destination.
    Merci pour tes conseils. et ta patience.
    Je vais essayer d'installer OverbyteIcsFtpCli

    Léo

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

Discussions similaires

  1. Envoyer un fichier sur un serveur FTP
    Par zenico64 dans le forum Général VBA
    Réponses: 3
    Dernier message: 26/11/2010, 09h27
  2. Envoyer un fichier sur un serveur ftp
    Par Pascmar dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 15/08/2007, 23h16
  3. Envoyer un fichier sur un serveur FTP par proxy
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 16h39
  4. Réponses: 4
    Dernier message: 15/09/2005, 13h27
  5. [FTP] Test de l'existence d'un fichier sur un serveur ftp
    Par lapartdombre dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 01/08/2005, 14h13

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