Скачать один файл, используя несколько потоков - PullRequest
6 голосов
/ 14 марта 2012

Я пытаюсь создать «Менеджер загрузок» для Linux, который позволяет мне загружать один файл, используя несколько потоков.Вот что я пытаюсь сделать:

  1. Разделите файл для загрузки на разные части, указав смещение
  2. Загрузите разные части во временную папку
  3. Объедините их в один файл.

Шаги 2 и 3 разрешимы, и я застрял на шаге 1.Как указать смещение при загрузке файла?

Использование чего-то вроде open("/path/to/file", "wb").write(urllib2.urlopen(url).read()) не позволяет мне указать начальную точку для чтения.Есть ли альтернатива этому?

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Чтобы загрузить часть файла, просто установите заголовок Range следующим образом

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

Хотя не все серверы поддерживают заголовок Range.Большинство служб обмена файлами этого не делают.

3 голосов
/ 14 марта 2012

сначала http-сервер должен вернуть заголовок Content-Length.обычно это означает, что файл является статическим файлом, если это динамический файл, например, в результате php или jsp, вы не можете сделать такое разделение.

тогда вы можете использовать заголовок http Range при запросеЭтот заголовок сообщает серверу, какая часть файла должна быть возвращена.Смотрите Python Doc, чтобы узнать, как установить и проанализировать http голову.

, чтобы сделать это, если размер детали равен 100 КБ, вы сначала запросите с Range: 0-1000000. 100 К получит первую часть, а в ответе на длину конуса укажите размер файла, затем начнитенить с разным диапазоном, будет работать

0 голосов
/ 14 марта 2012

См. File.seek в http://docs.python.org/library/stdtypes.html#file-objects.

Это может помочь.

Из интереса, что является причиной разделения файла?

...