関数と同じことを行うための単純なクラスdownload
:
import urllib
import threading
class Downloader:
def __init__(self):
self.stop_down = False
self.thread = None
def download(self, url, destination):
self.thread = threading.Thread(target=self.__down, args=(url, destination))
self.thread.start()
def __down(self, url, dest):
_continue = True
handler = urllib.urlopen(url)
self.fp = open(dest, "w")
while not self.stop_down and _continue:
data = handler.read(4096)
self.fp.write(data)
_continue = data
handler.close()
self.fp.close()
def cancel(self):
self.stop_down = True
したがって、誰かが[キャンセル]ボタンをクリックすると、cancel()
メソッドを呼び出す必要があります。
キャンセルしても部分的にダウンロードされたファイルは削除されないことに注意してください。ただし、os.unlink()
たとえば、を使用してこれを実現するのは難しいことではありません。
次のスクリプト例は、その使用方法を示しています。最大20Mbのファイルのダウンロードを開始し、5秒後にキャンセルします。
import time
if __name__ == "__main__":
url = "http://ftp.postgresql.org/pub/source/v9.2.3/postgresql-9.2.3.tar.gz"
down = Downloader()
down.download(url, "file")
print "Download started..."
time.sleep(5)
down.cancel()
print "Download canceled"