使用多个线程下载单个文件

时间:2012-03-14 12:08:46

标签: python download urllib2 fedora

我正在尝试为Linux创建一个“下载管理器”,让我可以使用多个线程下载一个文件。这就是我想要做的事情:

  1. 通过指定偏移量
  2. 将要下载的文件分成不同的部分
  3. 将不同的部分下载到临时位置
  4. 将它们合并为一个文件。
  5. 第2步和第3步是可以解决的,步骤#1是我被卡住了。如何在下载文件时指定偏移量?

    使用open("/path/to/file", "wb").write(urllib2.urlopen(url).read())行的内容不允许我指定要读取的起点。有没有替代方案?

3 个答案:

答案 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)

请参阅http://docs.python.org/library/stdtypes.html#file-objects中的file.seek。

这可能会成功。

出于兴趣,拆分文件的原因是什么?