2010-07-13 4 views
2

J'utilise actuellement le code suivant pour uploader un fichier sur un serveur distant:Comment obtenir une barre de progression de téléchargement pour urllib2?

import MultipartPostHandler, urllib2, sys 
cookies = cookielib.CookieJar() 
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
params = {"data" : open("foo.bar") } 
request=opener.open("http://127.0.0.1/api.php", params) 
response = request.read() 

Cela fonctionne très bien, mais pour des fichiers plus volumineux le téléchargement prend un certain temps, et ce serait bien d'avoir un rappel qui me permet d'afficher la progression du téléchargement?

J'ai déjà essayé la solution kodakloader, mais elle n'a pas de rappel pour un seul fichier.

Est-ce que quelqu'un connaît une solution?

Répondre

1

Je pense qu'il est impossible de connaître la progression du téléchargement avec urllib2. Je cherche à utiliser pycurl.

+0

Il semble que cela résout mon problème: http://pycurl.sourceforge.net/doc/callbacks.html – leoluk

3

Voici un extrait de notre script de dépendance python que Chris Phillips et j'ai travaillé sur @Cogi (bien qu'il ait fait cette partie particulière de celui-ci). Le script complet est here.

try: 
     tmpfilehandle, tmpfilename = tempfile.mkstemp() 
     with os.fdopen(tmpfilehandle, 'w+b') as tmpfile: 
      print ' Downloading from %s' % self.alternateUrl 

      self.progressLine = '' 
      def showProgress(bytesSoFar, totalBytes): 
       if self.progressLine: 
        sys.stdout.write('\b' * len(self.progressLine)) 

       self.progressLine = ' %s/%s (%0.2f%%)' % (bytesSoFar, totalBytes, float(bytesSoFar)/totalBytes * 100) 
       sys.stdout.write(self.progressLine) 

      urlfile = urllib2.urlopen(self.alternateUrl) 
      totalBytes = int(urlfile.info().getheader('Content-Length').strip()) 
      bytesSoFar = 0 

      showProgress(bytesSoFar, totalBytes) 

      while True: 
       readBytes = urlfile.read(1024 * 100) 
       bytesSoFar += len(readBytes) 

       if not readBytes: 
        break 

       tmpfile.write(readBytes) 
       showProgress(bytesSoFar, totalBytes) 

    except HTTPError, e: 
     sys.stderr.write('Unable to fetch URL: %s\n' % self.alternateUrl) 
     raise 
+1

cela montre la progression d'un téléchargement, correct? La question demande une barre de progression pour un téléchargement ... – priestc

Questions connexes