читать файл с сервера с некоторым смещением - PullRequest
7 голосов
/ 08 июля 2010

Как я могу прочитать файл с сервера, начиная с некоторого смещения (аналогично wget -c )?Какие заголовки я должен отправить на сервер?Какие фьючерсы должны поддерживать сервер?

Ответы [ 2 ]

15 голосов
/ 08 июля 2010

Вы должны использовать заголовок Range в запросе.Но вы можете использовать его только в том случае, если сервер сообщит вам, что он принимает запрос диапазона с помощью Accept-Ranges заголовка ответа.

Это пример сеанса.Предположим, мы заинтересованы в получении части этой картины .Сначала мы отправляем запрос HTTP HEAD, чтобы определить: а) поддерживает ли сервер диапазоны байтов, б) длина содержимого:

> HEAD /2238/2758537173_670161cac7_b.jpg HTTP/1.1
> Host: farm3.static.flickr.com
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Thu, 08 Jul 2010 12:22:12 GMT
< Content-Type: image/jpeg
< Connection: keep-alive
< Server: Apache/2.0.52 (Red Hat)
< Expires: Mon, 28 Jul 2014 23:30:00 GMT
< Last-Modified: Wed, 13 Aug 2008 06:13:54 GMT
< Accept-Ranges: bytes
< Content-Length: 350015

Затем мы отправляем запрос GET с *Заголовок 1012 *, запрашивающий первые 11 байтов изображения:

> GET /2238/2758537173_670161cac7_b.jpg HTTP/1.1
> Host: farm3.static.flickr.com
> Accept: */*
> Range: bytes=0-10
> 
< HTTP/1.1 206 Partial Content
< Date: Thu, 08 Jul 2010 12:26:54 GMT
< Content-Type: image/jpeg
< Connection: keep-alive
< Server: Apache/2.0.52 (Red Hat)
< Expires: Mon, 28 Jul 2014 23:30:00 GMT
< Last-Modified: Wed, 13 Aug 2008 06:13:54 GMT
< Accept-Ranges: bytes
< Content-Range: bytes 0-10/350015
< Content-Length: 11
< 

Это шестнадцатеричный дамп первых 11 байтов:

00000000  ff d8 ff e0 00 10 4a 46  49 46 00                 |......JFIF.|
0000000b

Для получения дополнительной информации см. Спецификация заголовка диапазона в HTTP RFC 2616.

3 голосов
/ 08 июля 2010

В http://www.gnu.org/software/wget/manual/wget.html

Обратите внимание, что ‘-c’ работает только с ftp серверы и с http-серверами, которые поддерживать заголовок Range.

В http://tools.ietf.org/html/rfc2616

Примеры спецификаторов байтовых диапазонов значения (при условии, что тело сущности
длина 10000):

  - The first 500 bytes (byte offsets 0-499, inclusive):  bytes=0-
    499

  - The second 500 bytes (byte offsets 500-999, inclusive):
    bytes=500-999

  - The final 500 bytes (byte offsets 9500-9999, inclusive):
    bytes=-500

  - Or bytes=9500-

  - The first and last bytes only (bytes 0 and 9999):  bytes=0-0,-1

  - Several legal but not canonical specifications of the second

500 байт (смещение байтов 500-999 включительно): байт = 500-600,601-999 байт = 500-700,601-999

Так что вы должны отправить

Range:bytes=9500-

Чтобы проверить, поддерживает ли сервер это, вы можете проверить диапазон приема как таковой

Исходные серверы, которые принимают запросы в диапазоне байтов, МОГУТ отправить

Диапазон принятия: байты

но не обязаны это делать. Клиенты МОГУТ генерировать байтовый диапазон запросы, не получив этот заголовок для ресурса участвует. Единицы измерения диапазона определены в разделе 3.12.

Серверы, которые не принимают какой-либо запрос диапазона для ресурс МОЖЕТ отправить

Accept-Ranges: none

, чтобы посоветовать клиенту не пытаться запросить диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...