我正在使用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
我在IOError处理程序中添加了self._netfile.close()和self._outfile.close(),它似乎已经解决了。我猜这个错误是由再次打开而不关闭它引起的。