Envoyer un fichier sur un serveur FTP.

Envoyer un fichier sur un serveur FTP.

InternetOpen, InternetConnect, FtpPutFile, InternetCloseHandle

Voir version :

Pas de dépendances

Télécharger :

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <wininet.h>  
#pragma comment(lib,"wininet.lib")

int main(void)
{
    HINTERNET hInet, hFtp;
    TCHAR* serveur = _T("ftpperso.free.fr");
    TCHAR* utilisateur = _T("fvirtman");
    TCHAR* password = _T("xxxxxxxxx");
    TCHAR* source = _T("d:/a.txt");
    TCHAR* dest = _T("tmp/a.txt");

    hInet = InternetOpen(0, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
    if(hInet == NULL) 
    {
        printf("InternetOpen Invalid Handle value\n");
        exit(-1);
    }
    hFtp = InternetConnect(hInet, serveur, INTERNET_DEFAULT_FTP_PORT, utilisateur, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    if( hFtp == NULL) 
    {
        printf("InternetConnect echec : code %d\n",GetLastError());
        InternetCloseHandle(hInet);
        exit(-1);
    }
    if (FtpPutFile(hFtp, source, dest, FTP_TRANSFER_TYPE_BINARY, 0))
        printf("Fichier ok\n");
    else
        printf("FtpPutFile echec : code %d\n",GetLastError());
    InternetCloseHandle(hFtp);
    InternetCloseHandle(hInet);
}



Commentaires


Voici comment se servir des fonctions FTP Windows.
Ce programme va mettre un fichier de votre disque dur sur mon propre site...

Et oui... Mais ! Si vous lancez le programme, vous allez vous prendre un : internet connect echec code 12014.
Et si on regarde la page des codes d'erreur :

http://msdn.microsoft.com/en-us/library/windows/desktop/aa385465(v=vs.85).aspx

On voit que le code s'appelle ERROR_INTERNET_INCORRECT_PASSWORD
Et bien oui, je ne vais pas vous donner mon mot de passe et vous permettre d'envoyer des fichiers sur mon site ! Non mais :)

Regardez le programme :
On défini plusieurs chaines :
- le serveur FTP
- le login
- le mot de passe (que j'ai soigneusement caché)
- le fichier de chez vous à envoyer
- ce qu'il devient sur le serveur FTP (il se met dans le repertoire temp, et garde le même nom)

Je vais me servir de tout ça pour me connecter.
D'abord, la fonction InternetOpen va me préparer Internet. sa doc :

http://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx
Tout ce que je mets ici, c'est INTERNET_OPEN_TYPE_DIRECT, et des 0 ailleurs. Si vous n'avez de proxy ou autres trucs exotiques, mettez
comme moi. Sinon, référez vous à la doc.

Ensuite, je me connecte avec InternetConnect. 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384363(v=vs.85).aspx

Je lui donne :
- le handle de la connexion créé avec InternetOpen
- le nom du serveur
- le port (INTERNET_DEFAULT_FTP_PORT vaut 21 parce que le protocole FTP utilise usuellement le port 21, mais on peut changer)
- le login
- le password
- le service, ici je veux du FTP, donc INTERNET_SERVICE_FTP
- et des options. Et pour ma connexion FTP, je vais demander une connexion passive, avec INTERNET_FLAG_PASSIVE

Si vous ne touchez pas le programme, c'est la que vous échouez. 
Si modifiez le programme avec un FTP à vous, ça marchera.

Et vous passerez à la fonction suivante :

FtpPutFile
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384170(v=vs.85).aspx

Vous lui donnez 
- le handle de la connexion créé avec InternetConnect
- le fichier sur votre disque
- l'endroit ou vous voulez l'envoyer
- le type de transfert ASCII ou BINAIRE (binaire marche toujours, remarquez que j'envoie un fichier txt en binaire...)
- un lien inutilisé ici vers une variable qui référence une fonction callback optionnelle. Je soupçonne ce paramètre de pouvoir avoir 
  le pourcentage de transmission du fichier (s'il est gros)

Regardez bien les codes d'erreur si ça ne marche pas chez vous.
A mon avis, on peut avoir : fichier introuvable sur le disque, repertoire introuvable sur le serveur, etc...