我正在尝试为Linux创建一个“下载管理器”,让我可以使用多个线程下载一个文件。这就是我想要做的事情:
第2步和第3步是可以解决的,步骤#1是我被卡住了。如何在下载文件时指定偏移量?
使用open("/path/to/file", "wb").write(urllib2.urlopen(url).read())
行的内容不允许我指定要读取的起点。有没有替代方案?
答案 0 :(得分:3)
要下载部分文件,只需像这样设置Range
标题
req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)
并非所有服务器都支持Range
标头。大多数文件共享服务都没有。
答案 1 :(得分:3)
首先,http服务器应返回Content-Length标头。这通常意味着文件是静态文件,如果是动态文件,例如php或jsp的结果,则不能进行这样的拆分。
然后,您可以在请求时使用http Range标头,此标头告诉服务器应该返回哪个文件部分。请参阅python doc以了解如何设置和解析http头。
要做到这一点,如果零件尺寸为100k,则首先请求范围:0-1000000 100k将获得第一部分,并在其响应的conent-length中告诉您文件的大小,然后启动一些不同的线程范围,它将工作
答案 2 :(得分:0)