Загрузите файл с помощью частичной загрузки (HTTP)

Я услышал хорошие вещи [приблизительно 110] IKVM, JVM, которой это сделано с.NET.

21
задан Paul D. Waite 31 January 2013 в 11:20
поделиться

3 ответа

Это довольно легко сделать, используя сокеты TCP и чистый HTTP. Соответствующий заголовок запроса - «Диапазон».

Пример запроса может выглядеть так:

mysock = connect(("www.example.com", 80))
mysock.write(
  "GET /huge-growing-file HTTP/1.1\r\n"+\
  "Host: www.example.com\r\n"+\
  "Range: bytes=XXXX-\r\n"+\
  "Connection: close\r\n\r\n")

Где XXXX представляет количество байтов, которые вы уже получили. Затем вы можете прочитать заголовки ответов и любой контент с сервера. Если сервер возвращает заголовок вроде:

Content-Length: 0

Вы знаете, что у вас есть весь файл.

Если вы хотите быть особенно хорошими в качестве HTTP-клиента, вы можете заглянуть в «Connection: keep-alive». Возможно, существует библиотека Python, которая делает все, что я описал (возможно, даже urllib2!), Но я не знаком с ней.

2
ответ дан 29 November 2019 в 20:28
поделиться

Можно выполнить частичную загрузку с использованием заголовка диапазона, следующий запрос будет запрашивать выбранный диапазон байтов:

req = urllib2.Request('http://www.python.org/')
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

Например:

>>> req = urllib2.Request('http://www.python.org/')
>>> req.headers['Range'] = 'bytes=%s-%s' % (100, 150)
>>> f = urllib2.urlopen(req)
>>> f.read()
'l1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.'

С помощью этого заголовка вы можете возобновить частичные загрузки. В вашем случае все, что вам нужно сделать, это отслеживать уже загруженный размер и запрашивать новый диапазон.

Имейте в виду, что сервер должен принять этот заголовок, чтобы это работало.

42
ответ дан 29 November 2019 в 20:28
поделиться

Если я правильно понял ваш вопрос, файл не изменяется во время загрузки, а регулярно обновляется. Если это вопрос, то ответ будет rsync .

Если файл постоянно обновляется, в том числе во время загрузки, вам необходимо изменить rsync или программу BitTorrent. Они разбивают файлы на отдельные фрагменты и загружают или обновляют фрагменты независимо. Когда вы дойдете до конца файла с первой итерации, повторите, чтобы получить добавленный кусок; продолжайте по мере необходимости. С меньшей эффективностью можно было просто повторно выполнить rsync.

-1
ответ дан 29 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: