Технические вопросы и ответы QA1761

Загрузки Resumable

Q: Мои загрузки приложений большие файлы по HTTP. Как я могу возобновить частично завершенную загрузку?

A: Ответ зависит от Вашей целевой платформы:

Возобновление Загрузки http не является слишком трудным, но необходимо понять некоторые критические понятия HTTP:

Основная стратегия возобновления загрузки:

  1. То, когда Вы делаете начальную загрузку, сохраняете тег объекта, связало ресурс.

  2. Поскольку Вы сохраняете данные на диск, помните, сколько из данных допустимо.

  3. Когда Вы приезжаете, чтобы возобновить загрузку, получить тег объекта и объем данных, Вы сохранили и применяете эти значения к запросу через Range и If-Range заголовки.

  4. Выполните запрос. Это или успешно выполнится (и Вы получите остающиеся байты ресурса), или это перестанет работать (когда необходимо получить весь ресурс с нуля).

Если сервер не делает тегов вспомогательного объекта, можно сделать подобные вещи с измененной в последний раз датой.

Для конкретного примера этого можно использовать трассировку пакетов (см. Технические Вопросы и ответы QA1176, 'Получение Трассировки пакетов') смотреть на то, как Safari возобновляет загрузку на Mac. Перечисление 1 показывает типичный запрос резюме.

Перечисление 1  HTTP возобновляет запрос

GET /download.info.apple.com/[...]/MacOSXUpdCombo10.6.8.dmg HTTP/1.1
Host: supportdownload.apple.com
User-Agent: Safari/7534.52.7 [...]
Accept: */*
If-Range: "968f3f3e86e0339ce722170ae656bc73:1319461845"
Range: bytes=4041400-
Accept-Language: en-au
Accept-Encoding: gzip, deflate
[...]
Connection: keep-alive

Range заголовок говорит серверу, что Вы хотите получить данные, запускающиеся при смещении 4041400. If-Range заголовок говорит серверу, что Вы только хотите те данные, если данные не изменились, так как сервер дал клиенту предоставленный тег объекта (т.е. «968f3f3e86e0339ce722170ae656bc73:1319461845»).

Перечисление 2 показывает соответствующий ответ.

Перечисление 2  HTTP возобновляет ответ

HTTP/1.1 206 Partial Content
Server: Apache
Accept-Ranges: bytes
Content-Type: application/octet-stream
Last-Modified: Mon, 24 Oct 2011 13:04:42 GMT
ETag: "968f3f3e86e0339ce722170ae656bc73:1319461845"
Date: Mon, 23 Jan 2012 16:13:25 GMT
Content-Range: bytes 4041400-1087036999/1087037000
Content-Length: 1082995600
Connection: keep-alive

Состояние HTTP (206) говорит Вам, что ответ только содержит подмножество ресурса. Content-Range заголовок говорит Вам точно, какой диапазон ресурса сервер возвращает (байт 4041400 через к байту 1087036999) и общая длина ресурса (1087037000). Наконец, Content-Length заголовок говорит Вам, сколько байтов сервер возвращается в этом определенном ответе.



История версии документа


ДатаПримечания
13.02.2012

Новый документ, объясняющий, как возобновить Загрузки http.