Résolu Problème avec FtpGetFile

Germouse

Nouveau membre
Bien le bonjour,
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:

EDIT MODO: Voir message suivant
 

Germouse

Nouveau membre
Toutes mes excuses:

[cpp]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[/cpp]
 

zeb

Modérateur
Pourquoi ne pas avoir modifié ton premier message plutôt que d'en réécrire un autre ? Ne t'ai-je pas donné une indication sur comment faire ?

------------------------------------------------------

Qu'importe. Je ne pense pas que ton code soit en cause. Sauf si bien sûr le dossier C:\dossier1 n'existe pas sur l'autre poste. Mais là, il ne faut pas exagérer. Que se passe-t-il lorsque tu tentes, sur l'autre poste, d'ouvrir ton fichier avec un navigateur (IE, FF) : ?
 

Germouse

Nouveau membre
Merci!

J'arrive à ouvrir mon serveur depuis Explorer. J'arrive même à déposer un fichier à la main dans le dossier2.
 

zeb

Modérateur
Bon alors si tu arrives à lire et où déposer un fichier à partir d'un poste sur lequel ton programme ne passe pas, c'est que nous n'avons pas un problème de pare-feu. Euh, en relisant ton code, je m'aperçois que de toute façon, dans ce cas, la fonction FtpSetCurrentDirectory aurait plantée. Tu es sûr que tu as les droits sur le répertoire C:\dossier1\ ?

Pour en être sûr, essaie de mettre ce code en ligne 28 :
Code:
CreateObject("Scripting.FileSystemObject").CreateTextFile chemin

Alors ?

Une autre solution, puisque tu sembles aimer les API C, c'est d'utiliser GetLastError, la fonction FtpGetFile renseigne le buffer d'erreur.
 

Germouse

Nouveau membre
Merci!

La ligne rajoutée ne donne rien.
J'ai aussi ajouté un "GetLastResponseInfo " qui me renvoie les infos suivantes:

Error 0: 200 Switching to Binary Mode
500: Illegal PORT Command
500: Unknown Command
 

zeb

Modérateur
La ligne rajoutée ne donne rien.
Le fichier est créé ou pas ?
Si oui, le problème est ailleurs.
Si non, tu as un problème d'accès au disque local.

500: xxxxxxxxxxx
Une erreur 5xx, c'est une erreur du côté du serveur. Si le serveur répond, c'est déjà ça. Révise tes chemins et tes habilitations. Ce n'est pas un problème VB.
 

Germouse

Nouveau membre
Le fichier est créé. Il se créait à la place du fichier Excel puisque j'avais mis "Chemin". J'ai changé le chemin d'accès et il se crée bien.

C'est plus inquiétant si c'est un pb de serveur. Je ne sais pas vraiment quoi faire. Si qqun a une idée. Merci pout tout en tout cas.
 

zeb

Modérateur
Ce n'est pas parce que ton problème me semble ne pas être dans ton code, qu'on va te lâcher pour autant.

Un code 500 est une réponse du serveur. Un serveur qui répond c'est positif, ça.
Il te faut plutôt étudier le fonctionnement d'un serveur FTP.

- Illegal PORT Command -
J'écartais tout problème de pare-feu. C'est probable qu'en fait, tu violes, en fonction du poste client, une règle d'accès.

Le serveur n'a pas pu ouvrir un port. Eh, tu sais comment fonctionne un serveur FTP ?
Etudie ton problème à la lumière de cette piste : FTP actif/passif.
 

Germouse

Nouveau membre
Merci, en fait la macro marche partout (depuis chez moi, mon bureau) sauf à un endroit. J'en déduis qu'il doit s'agir d'un pare-feu disposé par le fournisseur d'accès de l'endroit en question?
 

zeb

Modérateur
Oui, c'est un problème de pare-feu. Non, ce n'est pas forcément à cause du FAI, mais peut-être. Renseigne-toi sur le FTP actif/passif (c'est la solution pour passer outre ce problème particulier de pare-feu).
 

Germouse

Nouveau membre
Merci Zeb, renseignements pris auprés du fournisseur d'accès, il semblerait que ce soit bien un problème d'Actif /Passif. Saurais-tu quel code ftpgetfile me permettrait d'acccèder à mon serveur en mode passif?
 

zeb

Modérateur
Oh, il faut que je fasse tout ?
Lis ça :

Désolé, je suis adepte du précepte confucianiste "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson."
 

Germouse

Nouveau membre
OK, alors en fait mon code initial, je l'ai trouvé sur le net et j'ai fait un copier-coller. Ca veut dire qu'à la base c'est du chinois pour moi mais bon:

Dans ton lien je vais dans le lien InternetConnect Function puisque c'est celui qui m'intéresse. Dedans je vois au sujet du 7ème paramètre de la fonction:

dwFlags [in]
Options specific to the service used. If dwService is INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE causes the application to use passive FTP semantics.

Il faudrait donc que le 6ème paramètre, soit dwService soit égal à INTERNET_SERVICE_FTP? J'ai essayé et ça ne marche pas:

[cpp]
ftp_ok = InternetConnect(internet_ok, "site", 21, "Login", "mdp", INTERNET_SERVICE_FTP, 0, 0)
[/cpp]

Mais si ça se trouve je dis une aberration.

Pour rappel, voilà mes paramètres:

[cpp]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[/cpp]

Merci!
 

zeb

Modérateur
Meilleure réponse
[cpp]InternetConnect (
hInternetSession As Long,
sServerName As String, _
nServerPort As Integer,
sUsername As String,
sPassword As String,
lService As Long,
lFlags As Long,
lContext As Long) As Long[/cpp]
Regardons un peu mieux cette fonction. C'est très facile, d'autant que Crosoft adopte la notation hongroise. hInternetSession commence par un h comme Handle, sServerName par un s comme String, nServerPort par un n comme nombre, etc. Les sixième et septième paramètres sont des nombres codés longs, qui contiennent le services et les flags associés. Ils s'appellent logiquement L-quelque-chose :spamafote: C'est donc dans ces paramètres qu'il faudra mettre nos valeurs.

Bien. Maintenant as-tu lu cet article : ? Si non, fais-le. Si oui, as-tu mis l'option explicit dans ton code ? Si non, fais-le. Si tu ne sais pas pourquoi, relis l'article. Si oui, que sont INTERNET_SERVICE_FTP et INTERNET_FLAG_PASSIVE pour ton programme ? Quelle est leur valeur ?

Pour InternetConnect, il doit s'agir de constantes qui doivent respectivement valoir 1 et &H8000000.
Définis-les donc comme il t'a fallu définir InternetConnect.

Ça t'aide un peu ?
 

Germouse

Nouveau membre
Ca marche!
J'ai donné la valeur &H8000000 à INTERNET_FLAG_PASSIVE :InternetConnect(internet_ok, "site", 21, "Login", "mdp", INTERNET_SERVICE_FTP, &H8000000, 0)
et tout fonctionne.
Merci pour tout Zeb!
 

zeb

Modérateur
:sol:

Quant à l'utilisation de option explicit, elle t'aurait permis de trouver (au moins une piste) tout seul ;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 823
Membres
1 586 366
Dernier membre
Abso15
Partager cette page
Haut