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 :

reprendre un téléchargement ftp


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
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut reprendre un téléchargement ftp
    Bonjour.
    J'essaie de télécharger des gros fichiers via ftp, et donc je voudrais pouvoir reprendre un téléchargement s'il c'est arrété.
    J'essaie donc de lire le fichier destination s'il existe, afin de le réécrire avec un nombre précis de block. Ensuite, lors du retrbinary, je pass tant que le numero du block est <= au nombre de bloc écrits, sinon on append le fichier destination :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    self.nbFtpBlock = 0
    self.taille_bloc = 8192
    self.blockToRead = 0
     
    # si la source existe, on lit un nombre précis de bloc, puis on l'ecrit
    # si non, on écrit un fichier vide
    if self.destSize > 0: 
    	self.blockToRead = int(self.destSize / self.taille_bloc)
    	if self.blockToRead > 4:
    		sizeToRead = (self.blockToRead-4) * self.taille_bloc
    		content = open(self.dest, 'rb').read(sizeToRead)
    		open(self.dest, 'wb').write(content)
    	else:
    		open(self.dest, 'wb').write()
     
    from ftplib import FTP
    ftp = FTP(host)
    ftp.login(userPass[0], userPass[1])
     
    # on recupere la taille du fichier en ligne
    def ftpSize(ret):
    	self.taille_fichier = int( ret.split(" ")[len(ret.split(" ")) - 5] )
     
    ftp.retrlines('LIST '+ srcFile, ftpSize)
     
     
    def OnFtpHook(self, content):
    	if not content:
    		return
     
    	if os.path.isfile(self.dest):
    		self.currentSize = os.path.getsize(self.dest)
    	else:
    		self.currentSize = 0
     
    	if self.currentSize >= self.taille_fichier: 
    		return
     
    	self.nbFtpBlock += 1
     
    	print "-> ftp Hook block ", self.nbFtpBlock , self.currentSize, self.currentSize -  self.currentSizeBefore, self.taille_fichier
     
    	if self.destSize > 0 and self.nbFtpBlock <= (self.blockToRead - 4) :
    		pass
    	else:
    		print "-> ftp     writing", self.nbFtpBlock , self.currentSize, self.currentSize -  self.currentSizeBefore, self.taille_fichier
    		open(self.dest, 'ab').write(content)
     
    ftp.retrbinary('RETR '+f, self.OnFtpHook )
    Le résultat semble cohérent, jusqu'qu dernier block, par exemple avec un fichier dont 10 blocks ont été écrits :
    -> FTP Writing 10 blocks
    -> FTP userPass : ['*', '*']
    -> ftp Hook block 1
    ...
    -> ftp Hook block 10 81920 0 1086681
    -> ftp Hook block 11 81920 0 1086681
    -> ftp writing 11 81920 0 1086681
    ...
    -> ftp Hook block 134 1089536 8192 1086681
    -> ftp writing 134 1089536 8192 1086681
    -> done


    Et donc le dernier block arrivé ne devrait pas faire 8192, non ???
    J'ai du raté un truc tout bête, hélas, je n'ai pas trouvé d'exemple sur le web ( pas facile avec le mot "téléchargement" dans la recherche), je m'en remet donc à vos bon soins .

    Cordialement
    z

    [EDIT] ps: si le téléchargement n'est pas intérompu, cela fonctionne très bien ...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,
    Pourquoi ne pas regarder/utiliser wget, curl directement ou utiliser PyCurl ou urlgrabber (qui s'appuie dessus) - si vous voulez rester "python"?
    Ils savent déjà faire cela (les reprises) sous ftp et http (si le serveur 'supporte').
    Faire fonctionner cela de façon robuste en supportant différents OS et systèmes de fichiers est trop 'compliqué'.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pourquoi ne pas regarder/utiliser wget, curl, ...
    Heu, parceque je ne connait ni l'un ni l'autre, et ni l' autres d'ailleurs.
    Youpi !, je crois que j'ai une bonne piste ...

    Et oui, je voudrais tout faire en python, sur linux, win et mac, et, ... outch, , c'est trop robuste ...

    En attendant, merci de vos indices,

    Cordialement

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par zozizozu Voir le message
    Et oui, je voudrais tout faire en python, sur linux, win et mac, et, ... outch, , c'est trop robuste ...
    Bonne idée mais lorsqu'il s'agit de la fiabilité des données et que des logiciels existent open source le font déjà: vous apprendrez beaucoup plus en lisant les sources.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut
    Oui c'est vrai, pertinent même, je pense à "fiabilité", merci encore de vos sages conseils.
    Cela dit, c'est pas que j'aime réinventer la roue, mais je pensais que ce ne serait pas trop compliqué de faire du append en python...
    Mais par dessus tout, ce qui m'interresse plus encore que de résoudre mon problème, c'est de comprendre pourquoi mon code ne fonctionne pas.
    Le sujet reste donc ouvert pour moi.

    Z

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut (presque) résolut
    Bonjour, et tout d'abord excusez moi, j'avais mal lu votre réponse.
    J'ai donc installé urlgrabber, et regarder les sources. C'est un peu opaque pour moi, et je n'ai pas remarqué de différence fondamentale.
    De plus, les essais que j'ai fait sont plutot décevant (le thread se "frise" lors d'une reprise de dl).

    J'ai cependant remarqué que le 1er block que je recevais avait une taille de 1460, au lieu des traditionnel (1024*8) , j'ai donc rajouter 1460 à la taille à lire pour la réécriture du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeToRead = ( (self.blockToRead-4) * self.taille_bloc ) + 1460
    puis enlever ce block ds le hook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if self.destOrigSize > 0 and self.nbFtpBlock <= ( self.blockToRead - 4 + 1 ) :
    et cela fonctionne ...
    Je dois dire que je suis assez surpris de la taille de ce 1er bloc, y a t il une raison particulière à cela ?, cette taille est elle invariable ?

    Merci encor de vos conseils.
    Z

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/05/2007, 17h41
  2. [Windows 2000 server] Téléchargement FTP impossible sous IE6
    Par o151181 dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 24/11/2004, 18h00

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