Загрузка возобновления Python urllib2 не работает при повторном подключении к сети - PullRequest
2 голосов
/ 06 августа 2011

Я использую urllib2 для возобновления загрузки, примерно на основе этого метода. Я могу завершить программу и перезапустить ее, и она начинает скачивать с того места, на котором она остановилась, загружая файл того же размера, как если бы он был загружен сразу.

Однако я протестировал его при отключении и повторном включении сети, и он загружается неправильно. Размер файла заканчивается дольше, чем должен быть, и файл работает неправильно. Я что-то пропустил или это может быть ошибка urllib2?

    import urllib2
    opener = urllib2.build_opener();

    self.count = 0 # Counts downloaded size.
    self.downloading = True
    while (not(self.success) and self.downloading):
        try:
            self.Err = ""
            self._netfile = self.opener.open(self.url)
            self.filesize = float(self._netfile.info()['Content-Length'])

            if (os.path.exists(self.localfile) and os.path.isfile(self.localfile)):
                self.count = os.path.getsize(self.localfile)
            print self.count,"of",self.filesize,"downloaded."
            if self.count >= self.filesize:
                #already downloaded
                self.downloading = False
                self.success = True
                self._netfile.close()
                return

            if (os.path.exists(self.localfile) and os.path.isfile(self.localfile)):
                #File already exists, start where it left off:
                #This seems to corrupt the file sometimes?
                self._netfile.close()
                req = urllib2.Request(self.url)
                print "file downloading at byte: ",self.count
                req.add_header("Range","bytes=%s-" % (self.count))
                self._netfile = self.opener.open(req)
            if (self.downloading): #Don't do it if cancelled, downloading=false.
                next = self._netfile.read(1024)
                self._outfile = open(self.localfile,"ab") #to append binary
                self._outfile.write(next)
                self.readsize = desc(self.filesize) # get size mb/kb
                self.count += 1024
                while (len(next)>0 and self.downloading):
                    next = self._netfile.read(1024)
                    self._outfile.write(next)
                    self.count += len(next)
                self.success = True
        except IOError, e:
            print e
            self.Err=("Download error, retrying in a few seconds: "+str(e))
            try:
                self._netfile.close()
            except Exception:
                pass
            time.sleep(8) #Then repeat

1 Ответ

1 голос
/ 06 августа 2011

Я добавил self._outfile.close () с помощью self._netfile.close () в обработчике IOError, который, похоже, исправил это. Я предполагаю, что эта ошибка была вызвана открытием для добавления снова без закрытия.

...