Как работают загрузки с паузой?

18

Я использую Internet Download Manager (IDM) для загрузки данных, и я заметил, что в своем окне прогресса загрузки он показывает, может ли загрузка приостанавливаться (возобновляться). Как правило, сайты обмена файлами не позволяют возобновить передачу, если соединение разорвано.

Таким образом, вопрос заключается в следующем: как это работает? Это какой-то конфиг, который сделан на сервере? Чем это отличается от торрент-загрузок, где загрузка всегда возобновляема.

Rafay
источник

Ответы:

26

С точки зрения кодирования загрузка - это просто массив байтов, включенный в поток ответов HTTP.

Протокол HTTP 1.1 (см. стр. 30) включает поле в заголовке, называемое «Диапазон», которое позволяет запросу указать смещение байта и длину запрашиваемого ответа.

По сути, вы можете сказать: «дайте мне объект HTTP по этому URL, но я хочу только 1024–4096-й его байты». Затем клиентский браузер добавляет поток байтов в часть файла, уже загруженную. Клиент может определить, где он должен возобновить работу, просто проверив длину уже загруженного файла и увеличивая его, чтобы определить требуемое смещение.

Что касается того, как ваш менеджер загрузки может сказать, он отправляет HTTP-запрос "HEAD". Если код ответа - 206 (частичное содержимое), то поток http поддерживает возобновление.

Frank Thomas
источник
FTP также является широко используемым протоколом для передачи файлов. Раньше это было основным средством, хотя сейчас HTTP, вероятно, более распространен.
ChrisInEdmonton
FTP использует, по сути, ту же конструкцию, хотя мне пришлось бы изучить специфику, прежде чем пытаться реализовать код, который его использует.
Frank Thomas
1

Это может быть обработано с помощью Постоянный cookie , не путать с сессионный cookie или вы можете использовать [Viewstate], если сайт построен на ASP.NET, однако это не очень хорошая практика. Фрэнк Томас имеет лучший ответ.

Josh Campbell
источник
1
Я не уверен, почему этот ответ был отклонен, поэтому я проголосовал за него.
Ramhound
@FrankThomas, я только что подтвердил некоторые факты с нашим старшим разработчиком, и он сказал, что вы «можете» использовать постоянный cookie или viewstate для хранения индексной информации массива байтов, используемой в tracking & amp; возобновить загрузку через загрузчик на основе браузера, однако это не было хорошей практикой. Как правило, для больших возобновляемых файлов, таких как продукт MS, вы загружаете приложение «Менеджер загрузок», и оно работает так, как вы сказали. Я проголосовал за ваш ответ.
Josh Campbell
Этот ответ кажется бессмысленным. Это не проблема определения того, сколько файла было загружено; клиент уже знает это Вы можете сообщить об этом обратно на сервер, используя куки, но есть гораздо лучшие подходы. Заголовки, параметры GET или POST и т. Д. Вопрос заключается в том, как возобновить передачу файла, а не в том, как передать информацию на сервер.
ChrisInEdmonton
ОП спросил, как это работает, и я указал ему в направлении файлов cookie, чтобы он мог провести дальнейшие исследования. Существует дюжина различных способов, которыми разработчик может создать возобновляемый загрузчик. Я бы сделал это с помощью файлов cookie на клиенте для отслеживания состояния загрузки с помощью индекса start-stop и использовал бы C # на бэкэнде, чтобы вычислить, сколько было загружено (из индекса X в индекс Y), а затем возобновлено с Y. Загрузка с рабочего стола Менеджер делает то же самое, только он хранит свою информацию в текстовом файле или базе данных. Это не переполнение стека, я не пишу исходный код.
Josh Campbell
@JoshCampbell, проблема в том, что ваше решение будет работать только для людей, использующих ваше конкретное клиентское программное и серверное программное обеспечение. Как отмечает Фрэнк в своем ответе, существуют стандартные способы решения этой проблемы, и нет необходимости настраивать один из них. Кроме того, ваш ответ не указывает на процесс, с помощью которого некоторые сайты позволяют OP возобновлять загрузку, и поэтому не отвечает на вопрос. Вот почему я прокомментировал.
ChrisInEdmonton