IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Comment reprendre un FTP Data binary Transfer


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut Comment reprendre un FTP Data binary Transfer
    Bonjour a tous,

    Voila j'ai un probleme sur un de mes scripts Python 25 faisant du FTP Data binary transfer sur un server.
    De temps en temps en FTP Download je perds la connection avec le server, et je recois une exception "timeout".
    J'ai recu une partie du fichier avant l'exception de timeout.
    J'ai essaye de faire du retry (de relancer la commande "data = conn.recv(blocksize)"), mais sans succes.

    Question: Comment reprendre une connection, la ou elle s'est arretée sans tout relancer ?

    Merci de votre aide.

    Mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        def retrBinary(self, remote_file, blocksize=8192, rest=None):
            try:
                self.ftptransfer.ftp.voidcmd('TYPE I')
                conn = self.ftp.transfercmd("RETR %s" % remote_file, rest)
                while 1:
                    data = conn.recv(blocksize)
                    if (not data) and (self.SrcRemoteFileSize != self.totalBytes):
                        # Start Retry to FTP server
                        retry=1
                        print(">>> Received Data buffer empty and file not ended, Start Retry to FTP server")
                        while ((not data) and (retry<=3)):
                            print(">>> Retry data %s" % (retry))
                            data = conn.recv(blocksize)
                            if not data: retry +=1
                            else: 
                                break
                            time.sleep(2)
                        break
     
                print "Close Download file transfer\n"
                conn.close()            
                print "DL: Return voidresp"
                return self.ftp.voidresp() 
     
            except Exception, err:
                print traceback.format_exc()
                print("Received Exception during Transfer"

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Votre code n'est pas complet, il devrait suffire de renseigner "rest" et de croiser les doigts pour le serveur FTP (de son côté) supporte.

    Je trouve qu'il est un peu "compliqué", jetez un œil au post que j'avais commis sur le sujet, il y quelques temps.

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    D'abord, on peut essayer d'empêcher les déconnexions intempestives, ou au moins de les rendre plus rares, avec une astuce: http://python.developpez.com/faq/?pa...AllTimeConnect.

    On devrait aussi pouvoir reprendre un téléchargement fait incomplètement en utilisant l'option 'rest' de la commande retrbinary. Il s'agit d'un offset qui définira à partir de quel endroit le téléchargement reprendra. Si le serveur ne le supporte pas, cela générera une erreur ftplib.error_reply et il suffira alors de reprendre le téléchargement à 0 sans le 'rest'.

    J'ai déjà utilisé ce genre de technique en téléchargement http, mais jamais en ftp. Voir le message de wiztricks.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut
    Merci pour la reponse.
    Je crois avoir compris, en fait il faut rejouer la connection avec le reste du fichier a transferer, en esperant que le serveur support la fonction RESTART.
    Effectivement, je vais alleger mon code et re-essayer.

    Merci

    Bien Cordialement

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut
    Bonjour a tous,
    J'ai encore une question, car apres avoir modifier mon code, lorsque je relance la commande de reconnection apres une tres longue attente sans reponse du serveur "ftp.transfercmd("RETR %s" % remote_file, rest=self.RestBytes)" et je recois systematiquement un
    "10053, 'Software caused connection abort'" venant du server.

    Question: Est-ce que le serveur arrete la connection parcqu'il est tombe en Timeout ou qu'il ne support pas la commande restart ? ou bien est-ce que ma commande de restart n'est pas conforme ?

    ......
    {'t':565.917, DL 'bytes_transferred':3011676, 'throughput':43.235}
    [ftpDL t=600s]
    {'t':603.212, DL 'bytes_transferred':3212364, 'throughput':43.051}
    {'t':641.129, DL 'bytes_transferred':3413052, 'throughput':42.346}
    [ftpDL t=660s]
    {'t':679.671, DL 'bytes_transferred':3613740, 'throughput':41.658}
    {'t':718.107, DL 'bytes_transferred':3814428, 'throughput':41.774}
    [ftpDL t=720s]
    {'t':757.166, DL 'bytes_transferred':4015116, 'throughput':41.107}
    [ftpDL t=780s]
    [ftpDL t=840s]
    [ftpDL t=900s]
    [ftpDL t=960s]
    [ftpDL t=1020s]
    [ftpDL t=1080s]
    >>> Type_3: Received Exception during DL Transfer, TypeError: timed out
    >>> Re-start Data Transfer from: 4145124
    *cmd* 'PASV'
    *put* 'PASV\\r\\n'
    Traceback (most recent call last):
    conn = self.ftptransfer.ftp.transfercmd("RETR %s" % remote_file, rest=self.totalBytes)
    File "C:\\Python25\\lib\\ftplib.py", line 360, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
    File "C:\\Python25\\lib\\ftplib.py", line 325, in ntransfercmd
    host, port = self.makepasv()
    File "C:\\Python25\\lib\\ftplib.py", line 303, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
    File "C:\\Python25\\lib\\ftplib.py", line 244, in sendcmd
    self.putcmd(cmd)
    File "C:\\Python25\\lib\\ftplib.py", line 175, in putcmd
    self.putline(line)
    File "C:\\Python25\\lib\\ftplib.py", line 170, in putline
    self.sock.sendall(line)
    File "<string>", line 1, in sendall
    error: (10053, 'Software caused connection abort')

    >>> Received Exception during DL Transfer, TypeError: (10053, 'Software caused connection abort')
    DL: Close Local file

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    J'ai encore une question, car apres avoir modifier mon code
    Ah donc...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Par défaut
    Pas compris la reponse ...
    Ma question est plus sur la commande, je ne suis pas sur que la commande de RESTART fonctionne bien avecce serveur.
    Merci de votre aide.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Si vous modifiez le code, mieux vaut remettre le code modifié, vous ne croyez pas?

    Sinon que dois faire Restart exactement ? Détecter l'arrêt du server et redémarrer le download, c'est ça?

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/05/2006, 14h33
  2. [C#][FTP] Comment faire du FTP?
    Par bakonu dans le forum C#
    Réponses: 2
    Dernier message: 29/03/2006, 12h47
  3. MaxDom : Comment reprendre une incrémentation ?
    Par priest69 dans le forum Access
    Réponses: 9
    Dernier message: 24/01/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo