Code: Alles auswählen
import ftplib
import time
class ftp_transfer_callback_handler():
def __init__(self, filepath, callback = None, encoding = None):
"""
Init class, if u want encoding set it :D
Encoding just for blocksize, not for writing.
"""
self.file = open(filepath, "wb")
self.filepath = filepath
self.callback = callback
self.encoding = encoding
self.status_starttime = time.time()
self.status_totaltransfertime = 0
self.status_downloadedbytes = 0
def status(self):
return [self.status_starttime, self.status_totaltransfertime, self.status_downloadedbytes]
def transfer_callback(self, callback_data):
"""
Let the ftplib call this method
"""
self.file.write(callback_data)
timenow = time.time()
#print type(callback_data)
if self.encoding == None:
blocksize = len(callback_data)
else:
blocksize = len(callback_data.encode(encoding))
self.status_downloadedbytes += blocksize
self.status_totaltransfertime = timenow - self.status_starttime
if self.callback != None:
self.callback([self.status(),timenow, blocksize, self.encoding])
def test(status_data):
print status_data[0][2]
if __name__ == "__main__":
ftp = ftplib.FTP("ftp.de.debian.org")
ftp.login("anonymous", "pythontest")
ftp.cwd("/debian-archive/debian-amd64/pool/contrib/c/crafty-books-medtosmall")
file_transfer = ftp_transfer_callback_handler("crafty-books-medtosmall_1.0-2_all.deb", callback = test) #Init callback_handler
ftp.retrbinary("RETR crafty-books-medtosmall_1.0-2_all.deb", file_transfer.transfer_callback)
Im Grunde sind es mehrere Probleme.
Problem #1:
Ich will mit der klasse oben (ftp_transfer_callback_handler) den aktuellen status des file transfers an einen weiteren callback weitergeben, um später zBsp die aktuelle download geschwindigkeit und den fortschritt anzeigen zu können. Alles dreht sich irgendwie um die aktuell übertragenen bytes, welche ich via len(callback_data) herausfinde, in dann zu den vorherigen addiere. Das Problem dabei ist jedoch, dass ich damit ja schaue wie lange der string ist, also wieviele zeichen es sind, nicht aber wieviele bytes. Oftmals klappt das irgendwie mit dem len(str), aber hin und wieder dann doch nicht. Das lässt sich dann irgendwie mit dem Encoding ausbügeln, das ist mir aber zu wischiwaschi. Ist es vllt möglich, irgendwie herauszufinden, wie der string "decoded" ist, und ihn dann entsprechend zu encoden, um schlussendlich dann die richtigen bytes zu bekommen, oder gehts vllt anderst einfacher?
Problem #2:
Aktuellen downloadspeed anzeigen, also zBsp (k/m)bytes/S. Ich weiß nicht so genau wie ich das machen soll, da ich ja irgendwie herausfinden muss, wieviele bytes in einer sekunde durchgegangen sind. Stehe da auf dem Schlauch, wäre nett wenn man mir da helfen könnte.