Problème avec ftpgetfile

Signaler
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010
-
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010
-
J'ai un petit souci: Ftpgetfile marche quand je suis connecté depuis mon bureau (succès = True) mais pas quand je me connecte depuis un autre (succès=false). Avez-vous des éléments de réponse?

Merci!

Voici mon code:

Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Long, ByVal sServerName As String, _
ByVal nServerPort As Integer, ByVal sUsername As String, _
ByVal sPassword As String, ByVal lService As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
"FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
ByVal lpszDirectory As String) As Boolean
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" ( _
ByVal hConnect As Long, _
ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, _
ByVal fFailIfExists As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal dwFlags As Long, _
ByRef dwContext As Long) As Boolean

Sub cherche()
Dim Nom As String
Dim chemin As String

Nom = ActiveCell.Value + ".xls"
chemin = "C:\dossier1" + Nom

internet_ok = InternetOpen("", 1, "", "", 0)
If internet_ok Then
ftp_ok = InternetConnect(internet_ok, "serveur.com", 21, "login", "motdepasse", 1, 0, 0)
If FtpSetCurrentDirectory(ftp_ok, "/dossier2") Then
succès = FtpGetFile(ftp_ok, Nom, chemin, False, 0, &H0, 0)
End If

End If

If succès = False Then MsgBox ("le fichier '" + Nom + "' n'a pas été trouvé!")

If succès Then
Workbooks.Open Filename:=chemin
End If


End Sub

Mais alors j'ai un nouveau problème: Ftpgetfile marche quand je suis connecté depuis mon bureau (succès = True) mais pas quand je me connecte depuis un autre (succès=false). Avez-vous des éléments de réponse?

Merci!
A voir également:

15 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
le repertoire C:\dossier1 doit être crée pour que cela fonctionne.

est-ce bien le cas ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Merci pour la réponse.

Il l'est en effet. D'ailleurs quand je colle à la main le fichier dans le répertoire et que je demande de l'ouvrir via "Workbooks.Open Filename:=chemin ", il le fait, preuve que le répertoire et valide.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
te manque les InternetcloseHandle, c'est pas top, ca.

vu ta déclaration API, change:

FtpGetFile(ftp_ok, Nom, chemin, False, 0, &H0, 0)

en

FtpGetFile(ftp_ok, Nom, chemin, False, 0, &H0, Byval 0&)

d'ailleurs, il semble que tu n'as pas lu la doc :

msdn.microsoft.com/en-us/library/aa384157(VS.85).aspx

je veux dire que tu devrais transferer des ficheirs excel en Binary (FTP_TRANSFER_TYPE_BINARY)

Quand au fait que ca échoue, il serait bien de regarder le code de l'erreur (Err.LastDllError) pour diagnostiquer quoi que ce soit.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Merci beaucoup.
Je suis un peu novice en la matière alors je ne percute pas bien ce que me dit ton lien.
En tout cas Err.LastDllError me renvoie 12003 mais me renvoie cette erreur dés le début du code, donc ce n'est pas forcément lié.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
comme son nom l'indique "LASTDllError"
il faut regarder la valeur de cette propriété juste après l'appel à FtpGetFile

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Ce que j'ai fait aussi et ca continue de me retourner 12003.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
continue de fouiner :

ERROR_INTERNET_EXTENDED_ERROR
12003
An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text.


source:
msdn.microsoft.com/en-us/library/aa385465(VS.85).aspx

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Merci.

InternetGetLastResponseInfo me renvoie le message suivant:

Error 0: 200 Switching to Binary Mode
500: Illegal PORT Command
500: Unknown Command
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
PORT ? ton serveur ne l'accepte peut etre pas...
il doit attendre PASV

PORT: le serveur FTP se connecte au client (donc firewall a regler)
PASV: le serveur indique au client le port du serveur sur lequel le transfert de données doit s'initier

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Salut, me revoilà.

Nous avons mis un fichier sur le serveur avec Filezilla et voilà ce que ça donne pour les log:

Commande : USER Login
Réponse : 331 Please specify the password.
Commande : PASS ********
Réponse : 230 Login successful.
Commande : OPTS UTF8 ON
Réponse : 200 Always in UTF8 mode.
Statut : Connecté
Statut : Démarrage de l'envoi de C:\dossier1\fichier.xls
Commande : CWD /dossier2
Réponse : 250 Directory successfully changed.
Commande : TYPE I
Réponse : 200 Switching to Binary mode.
Commande : PASV
Réponse : 227 Entering Passive Mode (88,191,79,142,107,150)
Commande : STOR fichier.xls
Réponse : 150 Ok to send data.
Réponse : 226 File receive OK.
Statut : Transfert de fichier réussi
Statut : Déconnecté du serveur
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
le client a ici bien envoyé le fichier en mode Passif (PASV)

ton client VB, lui tente une liaison via PORT

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

C'est sans doute parce qu'il s'agit d'une mise d'un fichier sur le serveur. Désolé. Voici les logs pour une prise d'un fichier manuelle sur le serveur.

Commande : USER login
Réponse : 331 Please specify the password.
Commande : PASS ********
Réponse : 230 Login successful.
Commande : OPTS UTF8 ON
Réponse : 200 Always in UTF8 mode.
Statut : Connecté
Statut : Démarrage du téléchargement de /dossier2/fichier.xls
Commande : CWD /dossier2
Réponse : 250 Directory successfully changed.
Commande : TYPE I
Réponse : 200 Switching to Binary mode.
Commande : PASV
Réponse : 227 Entering Passive Mode (88,191,79,142,63,22)
Commande : RETR fichier.xls
Réponse : 150 Opening BINARY mode data connection for fichier.xls (70102 bytes).
Réponse : 226 File send OK.
Statut : Transfert de fichier réussi
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
euh, reexpliquons la chose.

en FTP, il y a deux canaux de communication.
un par lequel transite le protocole FTP, via le port 21, par default.

lorsque tu transfere des données (dans un send ou dans l'autre), pour transferer un fichier ou affihcer le contenu d'un repertoire, un canal de communication supplémentaire va être ouvert (DATA).

comme toute communication TCP/IP, il faut qu'une des deux entités ouvre un port
et que l'autre s'y connecte.

Il y a alors deux possibilités.

- Soit le serveur ouvre un port en ecoute, attendant que le client se connecte desus. Le serveur envoi via le canal de communication l'IP et le port à utiliser. (command PASV)

- Soit, on utilise la commande PORT, précisant au serveur FTP de se connecter sur un port donné du client.

Dans ton code VB, le message indique une commande PORT invalide. En gros, ton poste n'accepte pas les tentatives de connection du serveur. Tu devrais utiliser le mod assif (PASV).

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
Comme je te l'ai conseillé la semaine passée, donc, utilises le mode Passif :

voir INTERNET_FLAG_PASSIVE

ca devrait fonctionner bien mieux.




Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
12
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
25 août 2010

Merci Renfield!

Je crois que nous tenons la solution. L'origine du pb est d'ailleurs confirmé par le fournisseur d'accès. Histoire d'être assisté jusqu'au bout, pourrais-tu me dire comment intégrer INTERNET_FLAG_PASSIVE dans mon code. Merci encore!

Pour rappel


Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
    ByVal hInternetSession As Long, ByVal sServerName As String, _
     ByVal nServerPort As Integer, ByVal sUsername As String, _
     ByVal sPassword As String, ByVal lService As Long, _
     ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
     ByVal sAgent As String, ByVal lAccessType As Long, _
     ByVal sProxyName As String, _
     ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
     "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
     ByVal lpszDirectory As String) As Boolean
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" ( _
     ByVal hConnect As Long, _
     ByVal lpszRemoteFile As String, _
     ByVal lpszNewFile As String, _
     ByVal fFailIfExists As Long, _
     ByVal dwFlagsAndAttributes As Long, _
     ByVal dwFlags As Long, _
     ByRef dwContext As Long) As Boolean
Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias _
     "InternetGetLastResponseInfoA" (ByRef lpdwError As Long, _
     ByVal lpszBuffer As String, ByRef lpdwBufferLength As Long) As Boolean