python断点续传
#coding=utf-8
__author__ = 'zengqingming'
import urllib
import os
import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
#关键在206和416的状态处理
class myURLOpener(urllib.FancyURLopener):
def http_error_206(self, url, fp, errcode, errmsg, headers, data=None):
pass
def downloadFile():
loop = 1
dlFile = "xxx.apk"
existSize = 0
myUrlclass = myURLOpener()
if os.path.exists(dlFile):
outputFile = open(dlFile,"ab")
existSize = os.path.getsize(dlFile)
#If the file exists, then only download the remainder
myUrlclass.addheader("Range","bytes=%s-" % (existSize))
else:
outputFile = open(dlFile,"wb")
url = "http://xxx.com/20131213/%s" % dlFile
print url
webPage = myUrlclass.open(url)
responsedCode = webPage.getcode()
if responsedCode == 416:
loop = 0
print "Requested Range not satisfiable"
contentLength = webPage.headers['Content-Length']
print "contentLength:%s - existSize:%d " % (contentLength, existSize)
#If the file exists, but we already have the whole thing, don't download again
if int(contentLength) == existSize:
loop = 0
print "File already downloaded"
numBytes = 0
while loop:
data = webPage.read(8192)
if not data:
break
outputFile.write(data)
numBytes = numBytes + len(data)
#print "data:%s" % data
print "read " , len(data) , " bytes"
webPage.close()
outputFile.close()
for k,v in webPage.headers.items():
print k, "=",v
print "code:", webPage.getcode()
print "copied", numBytes, "bytes from", webPage.url
if __name__ == "__main__":
downloadFile()