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

Vis*_*hnu 6 python fedora download urllib2

我正在尝试为Linux创建一个"下载管理器",它允许我使用多个线程下载一个单独的文件.这就是我想要做的:

  1. 通过指定偏移量将要下载的文件分成不同的部分
  2. 将不同的部件下载到临时位置
  3. 将它们合并为一个文件.

第2步和第3步是可以解决的,步骤#1是我被卡住了.如何在下载文件时指定偏移量?

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

小智 5

首先,http 服务器应该返回 Content-Length 标头。这通常意味着该文件是静态文件,如果是动态文件,例如php或jsp的结果,则可以不进行这样的分割。

然后,您可以在请求时使用http Range标头,该标头告诉服务器应该返回文件的哪一部分。有关如何设置和解析 http 头的信息,请参阅 python 文档。

为此,如果部分大小为 100k,您首先使用 Range: 0-1000000 100k 请求将获得第一个部分,并在响应中的内容长度中告诉您文件的大小,然后启动一些具有不同 Range 的线程,它将工作


Kie*_*ong 4

要下载部分文件,只需Range像这样设置标题

req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)
Run Code Online (Sandbox Code Playgroud)

但并非所有服务器都支持Range标头。大多数文件共享服务都没有。