2017-07-12 8 views
0

J'ai un problème avec le composant idFTP Indy essayant de télécharger un fichier à partir de notre serveur. Il télécharge 99% du fichier, puis se bloque. L'instruction GET ne retourne pas. Tout ce qui a changé récemment, c'est que nous sommes passés de Desktops exécutant win 8.1 à des ordinateurs portables exécutant win10. Si j'écris la progression et la taille du fichier à l'écran, le téléchargement est assez rapide jusqu'à la fin, et les derniers octets ne se terminent pas. Le fichier que j'essaie de télécharger est 15 573 350 octets. Il arrive à environ 14 Mo (plutôt rapide) et s'arrête. J'ai essayé de télécharger un autre fichier, et c'est la même chose.Dans Delphi XE6 FTP instruction GET() ne retourne pas après le téléchargement terminé

Des idées?

Voici le code, il n'y a rien d'extraordinaire à ce sujet. Je l'ai copié à partir de notre application de travail pour essayer et tester, pour voir si c'était quelque chose dans le projet principal.

with IdFTP1 do 
    begin 
    Host := 'xxx'; 
    Username := 'xxx'; 
    Password := 'xxx'; 
    passive := True; 
    Connect; 
    ChangeDir('Service_Update'); 
    ChangeDir('QA'); 
    Self.Caption := Size('jam.zipper').tostring; 
    TransferType := ftBinary; //tried with and without 
    Get('jam.zipper','jam.zipper',true); 
    Button1.Caption := 'Done'; //never gets here 
    end; 

Répondre

0

Il existe de nombreuses façons pour que Get() puisse se bloquer comme décrit précédemment. Voici quelques façons suivantes:

  1. le serveur ne ferme pas la connexion de transfert gracieusement à la fin ou le serveur n'envoie un message de réponse FTP final sur la connexion de commande après le transfert est terminé. Utilisez un renifleur de paquets pour vérifier. Pour gérer cela, essayez d'affecter un ReadTimeout non infini sur les connexions de commande et de transfert.

  2. Si la session FTP passe par un routeur/pare-feu non compatible FTP, la connexion de commande peut expirer et être interrompue pendant un long transfert. Pour gérer cela, TIdFTP a une propriété NATKeepAlive pour configurer les keep-alives TCP sur la connexion de commande pendant les transferts. Si vous utilisez TIdFTP dans un thread de travail avec des gestionnaires d'événements qui effectuent des appels non synchronisés aux contrôles de l'interface utilisateur, cela peut entraîner toutes sortes de problèmes, y compris des blocages. Toujours synchroniser l'accès à l'interface utilisateur.

+0

Merci Rémy. Ce qui me chatouille, c'est que le serveur n'a eu aucun changement. La fonctionnalité de téléchargement a toujours fonctionné - jusqu'à ce que je découvre maintenant sur la victoire 10 que ce n'est plus. Pensez-vous que cela pourrait faire la différence? Pour le point 3, j'utilise en effet un thread. Mais mon code de travail actuel se comporte comme ma démo que j'ai partagée ici. Il télécharge rapidement tout et ensuite ne fait rien à la fin ... –

+0

Ok, il se trouve que j'avais tort. Je suis revenu à gagner 8.1 pour retester ceci et c'est le même problème. Doit dire que quelque chose a changé du côté du serveur et je vais enquêter maintenant ... –