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 :

Module de téléchargement HTTP


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 41
    Par défaut Module de téléchargement HTTP
    Bonjour,
    Existe-t-il un module permettant de télécharger un fichier via HTTP, qui supporte des fonctions comme mettre en pause le téléchargement, le redémarrer... ?


    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonjour,

    Avez vous regardé Urllib et urllib2 ?

  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,

    J'ai commis un petit tuto pour télécharger un fichier du web avec urllib, avec possibilité d'arrêt, et mise à jour d'une barre de progression. La pause ne devrait pas être compliquée à ajouter. Mais c'est avec la bibliothèque graphique PyQt4. Cependant, il devrait être facile d'en reprendre le principe avec une autre bibliothèque graphique:

    Chez developpez: http://pyqt.developpez.com/tutoriels...rger-fichiers/.

    Et sur mon site: http://python.jpvweb.com/mesrecettes..._fichier_pyqt4.

    Tyrtamos

    EDIT: Et voilà le code du tuto avec la pause en plus (toujours en PyQt4):

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os, time, urllib
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Abort(Exception):
        """classe d'exception crée pour l'arrêt du téléchargement avant la fin"""
        pass
     
    #############################################################################
    class Telecharger(QtCore.QThread):
        """Thread de téléchargement"""
     
        #========================================================================
        def __init__(self, source, destination, parent=None):
            super(Telecharger,self).__init__(parent)
            self.source = source
            self.destination = destination
            self.stop = False
            self.pause_etat = False
     
        #========================================================================
        def run(self):
            # lancement du téléchargement
            try:
                filename, msg = urllib.urlretrieve(self.source, self.destination, 
                                                         reporthook=self.infotelech)
                messagefin = u"Téléchargement terminé\n\n" + unicode(msg)
            except Abort:
                messagefin = u"Téléchargement avorté"
            # fin du thread: émission du message de fin
            #self.emit(QtCore.SIGNAL("fintelech(PyQt_PyObject)"), messagefin)
            self.emit(QtCore.SIGNAL("fintelech(PyQt_PyObject)"), messagefin)
     
        #========================================================================
        def infotelech(self, telechbloc, taillebloc, totalblocs):
            """reçoit les infos de progression du téléchargement"""
            # nécessaire pour stopper le téléchargement avant la fin
            if self.stop:
                raise Abort
            while self.pause_etat:
                if self.stop:
                    raise Abort # pour que l'arrêt marche aussi en situation 'pause'
                time.sleep(0.1)        
            # envoie les infos de progression à la fenêtre graphique
            self.emit(QtCore.SIGNAL("infotelech(PyQt_PyObject)"), 
                                              [telechbloc, taillebloc, totalblocs])
     
        #========================================================================
        def pause(self):
            # permet la mise en pause du téléchargement
            self.pause_etat = True
     
        #========================================================================
        def reprise(self):
            # permet la reprise du téléchargement après une pause
            self.pause_etat = False
     
        #========================================================================
        def stoptelech(self):
            # permet l'arrêt du téléchargement avant la fin
            self.stop = True
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            self.label1 = QtGui.QLabel(u"Adresse web du fichier à télécharger:", self)
            self.fichierweb = QtGui.QLineEdit(self)
     
            self.label2 = QtGui.QLabel(u"Adresse sur le disque:", self)
            self.fichier = QtGui.QLineEdit(self)
     
            self.depart = QtGui.QPushButton(u"Départ", self)
            self.depart.clicked.connect(self.depart_m)
     
            self.pause = QtGui.QPushButton(u"Pause", self)
            self.pause.clicked.connect(self.pause_m)
            self.pause_etat = False
     
            self.stop = QtGui.QPushButton(u"Stop", self)
            self.stop.clicked.connect(self.stop_m)
     
            self.barre = QtGui.QProgressBar(self)
            self.barre.setRange(0, 100)
     
            self.barre.setValue(0)
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.label1, 0, 0, 1, 3)
            posit.addWidget(self.fichierweb, 1, 0, 1, 3)
            posit.addWidget(self.label2, 2, 0, 1, 3)
            posit.addWidget(self.fichier, 3, 0, 1, 3)
            posit.addWidget(self.depart, 4, 0)
            posit.addWidget(self.pause, 4, 1)
            posit.addWidget(self.stop, 4, 2)
            posit.addWidget(self.barre, 5, 0, 1, 3)
            self.setLayout(posit)        
     
            self.telech = None
     
        #========================================================================
        def depart_m(self):
            if self.telech==None or not self.telech.isRunning():
                # initialise la pause
                self.pause_etat = False
                self.pause.setText(u"Pause")
                # initialise la barre de progression
                self.barre.reset()
                self.barre.setRange(0, 100)
                self.barre.setValue(0)
                # démarre le téléchargement
                source = unicode(self.fichierweb.text())
                destination = unicode(self.fichier.text())
                if destination == u"":
                    destination = os.path.basename(source)
                    self.fichier.setText(destination)
                self.telech = Telecharger(source, destination)
                self.connect(self.telech, QtCore.SIGNAL("infotelech(PyQt_PyObject)"), 
                                                                self.infotelech)
                self.connect(self.telech, QtCore.SIGNAL("fintelech(PyQt_PyObject)"), 
                                                                self.fintelech)
                self.telech.start()
     
        #========================================================================
        def pause_m(self):
            """Méthode appelée avec un clic sur le bouton pause/reprise"""
            if self.pause_etat:
                # l'état est en pause: il faut donc reprendre le téléchargement
                self.pause_etat = False
                self.pause.setText(u"Pause") # modif libellé du bouton pause
                self.telech.reprise() # donner l'ordre de reprise au thread
            else:
                # l'état est en téléchargement: il faut donc passer en pause
                self.pause_etat = True
                self.pause.setText(u"Reprise") # modif libellé du bouton pause
                self.telech.pause() # donner l'ordre de pause au thread
     
        #========================================================================
        def infotelech(self, msg):
            """lancé à chaque réception d'info sur la progression du téléchargement"""
            telechbloc, taillebloc, totalblocs = msg
            if totalblocs > 0:
                # on a la taille maxi: on peut mettre à jour la barre de progression
                p = int(telechbloc*taillebloc/totalblocs*100)
                self.barre.setValue(p)
                QtCore.QCoreApplication.processEvents() # force le rafraichissement
            else:
                # taille maxi inconnue: la barre sera une chenille sans progression
                if self.barre.maximum > 0:
                    self.barre.reset()
                    self.barre.setRange(0, 0)
     
        #========================================================================
        def fintelech(self, msg):
            """Lancé quand le thread se termine (normalement ou pas)"""
            QtGui.QMessageBox.information(self,
                u"Téléchargement",
                msg)
     
        #========================================================================
        def stop_m(self):
            """demande l'arrêt du téléchargement avant la fin"""
            if self.telech!=None and self.telech.isRunning():
                self.telech.stoptelech()
     
        #========================================================================
        def closeEvent(self, event):
            """lancé à la fermeture de la fenêtre quelqu'en soit la méthode"""
            self.stop_m() # arrête un éventuel téléchargement en cours
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 745
    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 745
    Par défaut
    Salut

    urlretrieve ne supporte pas _directement_ le redémarrage d'un download partiel, il faut hacker un urlopener et triturer les headers HTTP tel que montré ici

    curl (et pycurl) supportant ce genre de fonction 'en natif' sera peut être plus approprié. Le code ressemble au brico posté ici - il utilise ftplib -.

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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 41
    Par défaut
    Bonjour et merci pour toutes vos réponses,
    Je me rends compte que les serveurs HTTP que j'utilise ne supportent pas la reprise de téléchargement, je pense donc basculer vers FTP avec un script ressemblant à celui de wiztricks.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2009, 21h31
  2. Création module de téléchargement
    Par ran_kotoburi01 dans le forum Langage
    Réponses: 2
    Dernier message: 09/03/2009, 12h38
  3. Connexion + téléchargement - HTTPS
    Par nicodn02 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 16/10/2008, 23h00
  4. Fichier corrompu après téléchargement HTTP
    Par PP(Team) dans le forum C++
    Réponses: 2
    Dernier message: 26/04/2007, 09h09

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