Page 1 sur 1
[reglé] SendFTPFile = fichier reçu à 0
Publié : jeu. 02/mars/2023 18:15
par Francois
Bonsoir,
Je viens de télécharger la version « PureBasic 6.00 LTS (Windows - x64) »
Mon PC est sur Windows 10 pro et à jour.
Le serveur FTP est sous Debian Bullseye et à jour.
Je souhaite envoyer depuis mon PC sur le serveur FTP un fichier texte généré par notepad de 3 lignes soit 1 koct.
(Plus tard, les fichiers pourront peser plusieurs mégas.)
Le fichier à envoyer est placé côté PC dans le répertoire courant, d’où s’exécute mon programme PB.
Côté serveur, il faut le déposer dans un sous-répertoire « upload »
L’opération fonctionne directement sous DOS avec la commande FTP, ou dans Excel 2021 en VBA avec la fonction : FtpPutFile Lib "wininet.dll"
Lorsque j’exécute le programme qui suit, je retrouve bien le fichier transmit, mais vide.
Quelle erreur ai-je faite ?
PS : j’ai aussi essayé en asynchrone avec une boucle d’attente, sans succès.
Merci par avance pour votre aide.
Code : Tout sélectionner
If OpenFTP(0,"10.0.1.100","ftp_user","xxxxx")
If SetFTPDirectory(0,"/upload")
If SendFTPFile(0,"test.txt","test.txt",#False)
Debug "Fichier envoyé."
Else
Debug "Fichier non envoyé."
EndIf
Else
Debug "Erreur lors du changement de répertoire FTP."
EndIf
Else
Debug "Erreur lors de la connexion au serveur."
EndIf
Re: SendFTPFile = fichier reçu à 0
Publié : jeu. 02/mars/2023 18:56
par Mindphazer
Est-ce que ton fichier test.txt est toujours ouvert dans notepad quand tu fais l'envoi FTP ?
Ca pourrait explorer que le FTP réussisse à créer le fichier sur la destination, mais ne peut pas lire le fichier source, et donc n'a rien à écrire sur le fichier destination
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 8:06
par Francois
Bonjour,
Non, mon fichier n’est pas verrouillé par un process quelconque.
Je maintiens que les commandes FTP internes à PB ne fonctionnent pas. Il y a déjà eu une ébauche de discussion sur le forum anglais il y a quelque temps curieusement interrompu.
MAIS, je viens de comprendre que PB avait intégré et mis à disposition la DLL wininet.dll ce qui est une excellente nouvelle car plus besoin de la déclarer.
DONC, je partage ici une solution fonctionnelle pour envoyer des fichiers en FTP. Il ne restera qu’à l’habiller un peu.
Merci à ceux et celles qui ont essayé de m’aider.
Bonne programmation à tous.
Code : Tout sélectionner
; Initialisation de la connexion FTP
HwndOpen = InternetOpen_("connexionFTP", 0, #Null, #Null, 0)
; Connexion au serveur FTP (en mode passif)
HwndConnect = InternetConnect_(HwndOpen, FTP_SRV$, 21, FTP_USR$, FTP_PWD$, 1, 0, 0)
If (HwndConnect = 0)
MessageRequester( "ERROR","Une erreur est survenue lors de la connexion. Vérifiez les informations de connexion.")
InternetCloseHandle_( HwndConnect)
InternetCloseHandle_( HwndOpen)
; Prévoir de sortir
EndIf
; Envoi d'un fichier
HwndPut = FtpPutFile_(HwndConnect, "test.txt", "/upload/test.txt", 0, 0)
If (HwndPut = 0)
MessageRequester( "ERROR","Une erreur est survenue lors de l'envoi du fichier : ")
InternetCloseHandle_( HwndConnect)
InternetCloseHandle_( HwndOpen)
; Prévoir de sortir
EndIf
; Fermeture des connexions FTP
InternetCloseHandle_( HwndConnect)
InternetCloseHandle_( HwndOpen )
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 11:29
par Mindphazer
Francois a écrit : ven. 03/mars/2023 8:06
Je maintiens que les commandes FTP internes à PB ne fonctionnent pas.
Un peu hâtif comme jugement, non ?
J'utilise les commandes FTP natives de PB depuis des lustres sans n'avoir jamais eu le moindre problème.
Francois a écrit : ven. 03/mars/2023 8:06
DONC, je partage ici une solution fonctionnelle pour envoyer des fichiers en FTP.
Fonctionnelle
sous Windows uniquement, vu que tu utilises des API.
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 12:00
par Francois
Peut-être, mais dans l'environnement que j'ai décrit lors de mon premier message, le simple programme FTP de 13 lignes ne fonctionne malheureusement pas.
Apparemment, je ne suis pas le seul. Ce problème a déjà été évoqué sur le forum en anglais le 9 nov. 2022. Malheureusement, la réponse de certains ont laissé penser qu'il s'agissait d'un BOT et le sujet fut abandonné, d'où mon idée de le rouvrir.
Ici le fameux post :
https://www.purebasic.fr/english/viewtopic.php?t=80098
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 12:10
par Mindphazer
Je n'ai malheureusement pas de serveur Debian sous la main, mais ton programme de 13 lignes fonctionne parfaitement de mon coté, depuis un Win10 pro vers un serveur Windows sur lequel un FilezillaFTP Serveur est installé.
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 12:58
par Ar-S
Bonjour, merci de mettre vos codes entre les balises CODE.
J'ai corrigé pour cette fois.
Re: SendFTPFile = fichier reçu à 0
Publié : ven. 03/mars/2023 14:26
par Francois
Désolé pour la balise, j’y veillerai la fois prochaine.
Intéressant, que cela fonctionne chez vous.
Du coup dans le doute, je viens de rebooter mon PC et là, oh miracle le programme de 13 lignes fait ce qu’on lui demande.
J’avais pourtant fermé et relancé PB plusieurs fois, mais je n’avais jamais relancé le PC.
Alors 2 hypothèses peuvent être envisagées :
- Il s’agit d’un problème d’upgrade entre PB v5.60 et v6. Il est vrai que j’ai fait cette mise à jour sans redémarrer le PC, car tout bêtement, le système ne me l’avait pas demandé.
- Il s’agit d’un problème de mauvaise initialisation de l’environnement PB qui obligerait à redémarrer le PC lorsque certaines fonctionnalités ne fonctionnent plus. Cela n’est d’ailleurs pas incompatible avec la première hypothèse.
Quoi qu’il en soit, tout refonctionne avec les commandes internes FTP.
Néanmoins, dans le doute et pour plus de sécurité, je continuerais à utiliser les API wininet qui sont plus fastidieuses à mettre en place, mais qui ne m’ont pas fait défaut jusque-là. Pour sûr, je continue avec PB qui a l’avantage d’être moins lourd que VB6 que j’utilisais avant. Dès que l’occasion se présentera, je le testerais sous Debian pour remplacer mes scripts BASH toujours aussi fastidieux à débugger.
Merci beaucoup de m’avoir fait part de vos réflexions qui m’on permis d’y voir plus clair.
Bonne programmation à tou(te)s.
Re: [reglé] SendFTPFile = fichier reçu à 0
Publié : dim. 05/mars/2023 10:11
par Marc56
Hello,
Quand un fichier envoyé se retrouve à zéro c'est que rien n'a été envoyé. (testé)
Lors d'un transfert FTP, le système commence par créer un fichier vide sur la destination.
Ensuite il transfert le fichier par blocs.
Si tu ne précises pas le
chemin complet du fichier source ou si tu n'es pas certain d'être
déjà dans le répertoire source, il n'y a aura aucun message d'erreur et le fichier vide ne sera pas effacé. C'est le cas.
(le fait de lancer l'IDE dans un répertoire ne fait pas changer de répertoire par défaut)
Il faut tester que le fichier source existe. (Utiliser FileSize() et non pas IsFile() qui lui ne teste que le handle du fichier)
Code : Tout sélectionner
File$ = GetTemporaryDirectory() + "test.txt"
If FileSize(File$) <= 0
Debug "file not found"
End
EndIf
If OpenFTP(0,"127.0.0.1","ftp_user","xxxxx")
If SetFTPDirectory(0,"/upload")
If SendFTPFile(0, File$,"test.txt",#False)
Debug "Fichier envoyé."
Else
Debug "Fichier non envoyé."
EndIf
Else
Debug "Erreur lors du changement de répertoire FTP."
EndIf
Else
Debug "Erreur lors de la connexion au serveur."
EndIf
PS. Tu dois bien te douter qu'arrivant dans un langage qui existe depuis 25 ans, les fonctions FTP ont été testés et sont utilisées (y compris par des entreprises) au quotidien par plusieurs milliers de personnes. Un "bug" sur une fonction de base aurait été signalé et corrigé depuis longtemps. (Le lien donné est un bot/chatgpt ou autre)
Enjoy PB
