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

7
我正在尝试为Linux创建一个“下载管理器”,以便使用多个线程下载单个文件。这就是我想要做的:
  1. 通过指定偏移量将要下载的文件分成不同部分
  2. 将不同的部分下载到临时位置
  3. 合并它们成为单个文件。
步骤2和3可以解决,而我卡在了第1步。如何在下载文件时指定偏移量?
使用类似open("/path/to/file", "wb").write(urllib2.urlopen(url).read())这样的方法不能让我指定读取的起始点。有没有替代方法?

1
为什么你想要使用多线程下载?这样做并不能使下载速度更快。 - Jakub Zaverka
你不能使用多个文件并在之后合并吗?你可以将远程文件的每个块保存在临时目录中,然后在之后合并所有内容。 - hurtledown
1
通常是这样的。如果您尝试使用 wget 和像 DownThemAll(适用于Firefox)这样的下载管理器下载相同的文件,您可以看到差异,甚至可以尝试使用 方法使用多线程 wget - Vishnu
@hurtledown:我的问题是,我如何下载一个文件的不同部分 - Vishnu
2
这里有答案:http://stackoverflow.com/questions/3328059/how-to-create-partial-download-in-twisted - Adam
3个回答

4
首先,HTTP服务器应该返回Content-Length头部信息。这通常意味着文件是静态文件,如果它是动态文件,比如PHP或JSP的结果,你就不能进行分割。
其次,你可以在请求时使用HTTP Range头部信息,这个头部信息告诉服务器应该返回文件的哪一部分。请参考Python文档了解如何设置和解析HTTP头部信息。
为了实现这个目标,如果每一部分的大小是100k,你首先用Range: 0-1000000请求第一部分,它的Content-Length会告诉你文件的大小,然后启动一些线程来请求不同的Range,这样就可以实现了。

我已经寻找这个答案六个月了,谢谢。 - undefined

3

想要下载文件的部分内容,只需设置Range头,像这样:

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

然而,并非所有服务器都支持Range头部。大多数文件共享服务不支持。


0

这是一个远程托管的文件,我需要访问它。不是我系统上的文件。 - Vishnu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接