[reglé] SendFTPFile = fichier reçu à 0

Sujets variés concernant le développement en PureBasic
Francois
Messages : 4
Inscription : jeu. 02/mars/2023 18:02

[reglé] SendFTPFile = fichier reçu à 0

Message 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
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: SendFTPFile = fichier reçu à 0

Message 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
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Francois
Messages : 4
Inscription : jeu. 02/mars/2023 18:02

Re: SendFTPFile = fichier reçu à 0

Message 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 )
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: SendFTPFile = fichier reçu à 0

Message 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.
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Francois
Messages : 4
Inscription : jeu. 02/mars/2023 18:02

Re: SendFTPFile = fichier reçu à 0

Message 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
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: SendFTPFile = fichier reçu à 0

Message 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é.
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SendFTPFile = fichier reçu à 0

Message par Ar-S »

Bonjour, merci de mettre vos codes entre les balises CODE.
J'ai corrigé pour cette fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Francois
Messages : 4
Inscription : jeu. 02/mars/2023 18:02

Re: SendFTPFile = fichier reçu à 0

Message 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.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: [reglé] SendFTPFile = fichier reçu à 0

Message 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
:wink:
Répondre