Ci joint un petit client ftp fais avec winsock!!!
Il est très basic, mais après plusieurs essaie avec inet infructueux !!! et surtout les contraintes comme l'impossibilité d'utiliser des chemins de fichiers ou mm des noms de fichiers avec espace dans la ligne de commande "Execute GET ou PUT", je me suis mit a étudier la RFC FTP et utiliser WInsock pour mes opérations sur ftp!!!
Après Test, je trouve winsock plus stable et moins contraignant bien que plus compliqué que inet !!!
Ci joint une capture et le projet VB!!!!
Ci dessous qq. Explications sur le fonctionnement de mon appli et du protocole FTP, je dis explications en toute modestie et non "Tuto!!!!"
Si vous avez des questions ou si vous avez vu une erreur de ma part "Personne n'est parfais!!!", signalez le moi!!!!
les Commandes utilisées : Renomer (dossier ou fichier), liste des fichiers, cretaion de dossier, suppression de dossier, Téléchargement Envoie de fichier avec Progress bar.
Le code est a améliorer, comme par exemple la supression de dossier non vide ou les opérations sur plusieurs fichiers etc.... mais c'est déja une bonne base je pense ? pour un client Ftp Maison...
Source / Exemple :
1. CONNECTION ET IDENTIFICATION
On Utilise un ctrl winsock : SckFtp envoie les commandes et réceptionne la réponse serveur)
SckFtp.Connect "Serveur ftp", "Port en général 21"
On envoie les commandes pour s'identifier avec la socket SckFtp
SckFtp.SendData "USER " & Login & Vbcrlf
SckFtp.SendData "PASS " & Password & vbCrLf
On envoie la demande de connexion en mode Passif
SckFtp.SendData "PASV" & vbCrLf
2. RECEPTION REPONSES SERVEUR
On recupére les réponses serveur dans le sckFtp (Evénement Data_Arrival)
Dim TxtRecu as string
SckFtp.GetData TxtRecu , VbString
Attention la réponse renvoyé peu être multi ligne donc il faudra découpé
La variable TxtRecu avec un split sur le chr(10)
dans un tableau par exemple!!!
Les réponses sont sous la forme :
215 UNIX Type: L8
227 Entering passive mode (82,196,4,13,9,10)
150 Connection established for the data.
226-Fichiers utilises: 10/4000
226-Volume utilise: 1401036/104857600
226 Transfer ended
Lorsque le 4 éme caractère n'est pas un "-" alors c'est un code correspondant
a une réponse du serveur, sinon ce sont des commentaires.
3. TRAITEMENT DES REPONSES SERVEUR
En fonction des codes reçus on fait une action, on analyse les 3 premiers caractère de TxtRecu (DataArrival de SckFtp)
Ici à l'ouverture de la connexion on attend l'acceptation du mode passif
(Code 227) :
227 Entering passive mode (81,191,4,13,9,10)
Et on extrait le port pour le transfert de données émit par le serveur.
Les 4 premiers chiffres entre parenthèse correspondent à votre IP 81.191.4.13
Pour connaître le port il faut extraire les 2 derniers chiffres entre
Parenthèses ici : 9 et 10
Ensuite on multiplie le Premier par 256 et on ajoute le 2éme
Donc ici (9*256)+10 = 2314 est le port pour le sock des données
(Réception texte, fichier ou envoie)
On a maintenant récupéré le Port, on va donc connecter le socket de données que l'on nome SckData
SckData.Connect "Serveur", "Port dans cet ex : 2314)
Et avec le socket sckFtp on envoie la commande List
SckFtp.SendData "LIST" & vbCrLf
Ensuite pour récupérer la liste de fichier il suffit de la récupérer dans le socket SckData (Evenement DataArrival)
Dim StrString As String
SckData.GetData StrString, vbString, bytesTotal
StrString contient maintenant la liste des fichiers :
drwxr-xr-x 1 bob5959 bob5959 0 Apr 15 18:12 Dossier
-rw-r--r-- 1 bob5959 bob5959 1 Apr 15 15:50 azer.jpg
-rw-r--r-- 1 bob5959 bob5959 20993 Apr 15 15:52 demande movie.doc
-rw-r--r-- 1 bob5959 bob5959 16384 Apr 15 15:57 demande movie2.doc
-rw-r--r-- 1 bob5959 bob5959 16384 Apr 15 15:57 image19(51).JPG
-rw-r--r-- 1 bob5959 bob5959 94534 Apr 15 16:06 image6(27).JPG
-rw-r--r-- 1 bob5959 bob5959 46090 Apr 15 15:17 interface.jpg
-rw-r--r-- 1 bob5959 bob5959 8192 Apr 15 16:02 menudiapo(11).jpg
-rw-r--r-- 1 bob5959 bob5959 16384 Apr 15 15:51 Sans titre.JPG
Autorisation Taille Date Fichier/dossier
Ensuite il est facile d'extraire les données utiles pour le soft
Il est important de récupérer les noms de fichier avec leur taille,
en vu d'un téléchargement!
J'ai donc stocké chaque taille respectivement dans un tableau et chaque nom est affiché dans un listbox
Pour les dossiers je rajoute un "/" devant.
Pour les autres cas, l'action effectué sera en fonction du code envoyer par le serveur, Exemple :
On envoie la commande Mkd (Création d'un nv dossier sur le serveur) avec SckFtp
SckFtp.SendData "Mkd Nouveau Dossier" & vbCrLf
Réponse dans l'évenement DataArrival de SckFtp
257 Ok
Alors on relance la commande LIST afin de réafficher la liste des fichiers....
ETc.....
PS : Les commandes sont disponibles dans la RFC (Français)
http://www.eisti.fr/res/res/rfc959/959-4_inter_fr.dim?session=101609#4.1.2
TELECHARGEMENT
==============
Dans mon code j'utilise la sock : SckDl
Il faut utiliser la commande "RETR" que l'on envoie avec SckFtp
Mais auparavant il faut définir le Type
SckFtp.SendData "TYPE I" & vbCrLf
Ensuite on attend la réponse du serveur (DataArrival de Sckftp)
200 Set Type I
Et on connecte la socket Sckdl au serveur et au port, et on envoie la commande RETR (Téléchargement)
SckDl.Connect "Sereveur", "Port (2314)"
SckFtp.SendData "Retr " & Fichier.ext & vbCrLf
Le serveur renvoie dans la SOcket SckFtp :
150 Connection established for the data.
226 Transfer ended
Le fichier arrive dans la socket SckDl (Evenement dataArrival) et on stocke le fichier dans StrBuffer
Dim Temp As String
SckDl.GetData Temp
StrBuffer = StrBuffer & Temp
Et on vérifie si la taille de buffer est égal a la taille du fichier télécharger,
Si c'est le cas alors le téléchargement et terminé, et on écrit le fichier
La Taille (TailleFic) à été récupérer dans le tableau en traitant la commande LIST
If Len(StrBuffer) = TailleFIc Then
Open "c:\fichier Télécharger.ext" for output as #1
Print #1, StrBuffer
Close #1
SckDl.close 'on ferme le sock
End if
UPLOAD
======
Dans le code j'utilise la sock : Sckup
Il faut utiliser la commande "STOR"
Mais auparavant il faut stocker le fichier dans le buffer (StrBuffer), pour cela on l'ouvre en mode binaire :
Open "Le fichier a envoyer.ext " For Binary Access Read Lock Read Write As #1
StrBuffer = Input(LOF(1), #1)
Close #1
Ensuite on envoie la commande STOR au serveur avec la sckFtp :
SckFtp.SendData "STOR " & 'Nom du fichiers dur le serveur.ext' & vbCrLf
Et on connecte la sock sckup au serveur :
SckUp.Connect "Serveur", "Port (2314)"
Ensuite des que la sock sckup est connecté, on envoie le fichier qui se trouve dans le Buffer(StrBuffer):
SckUp.SendData StrBuffer & vbCrLf
Dans l'événement SendProgress de la sock sckup , bytesRemaining permet de récupérer l'avancement :
Label1= Len(StrBuffer) - bytesRemaining
Et Pour savoir si l'envoie est terminé :
If bytesRemaining = 0 Then
sckUp.Close 'On ferme la sock
Msgbox "Envoie terminé..."
End if
Pcpunch!!!!!
Conclusion :
Ps : Durand je télécharge certain fichier (en général les fichier plus de 200Ko), j'ai une erreur "502 Fichier non ouvert" qui revient du serveur!!!
Apres plusieurs tentatives de déboguage, j'ai testé avec mon client ftp "total commander" qui lui aussi me renvoie la mm erreur. Donc apparemment ce n'est pas le code qui est en cause mais plutôt le serveur FTP (Testé sur un ftp Ifrance)
Si qq sait pourquoi, ou si vous avez le mm problème alors qu'avec un autre client Ftp le problème ne se pose pas, faite le moi savoir SVP!!!!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.