Як працюють завантаження з паузою?


19

Я використовую Менеджер завантажень Internet (IDM) для завантаження даних, і я помітив, що у вікні прогресу завантаження він показує, чи може завантаження пауза (може відновитись). Як правило, сайти для обміну файлами не дозволяють відновити передачу, якщо з'єднання розірвано.

Тож питання таке: як це працює? Це якась конфігурація, яка робиться на sever? Чим це відрізняється від завантажень торентів, де завантаження завжди може бути відновлене.

Відповіді:


27

З точки зору кодування, завантаження - це лише просто байтовий масив, включений у потік відповідей HTTP.

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

Отже, по суті, ви можете сказати: "дайте мені об’єкт HTTP за цією URL-адресою, але я хочу лише 1024-й - 4096-й байт". Потім клієнтський браузер додає потік байтів до частини вже завантаженого файлу. Клієнт може сказати, де його потрібно відновити, просто перевіривши довжину вже завантаженого файлу та збільшуючи його, щоб визначити необхідне зміщення.

Щодо того, як може розповісти менеджер завантажень, він надсилає запит HTTP "HEAD". Якщо код відповіді - 206 (частковий вміст), то http-потік підтримує відновлення.


FTP також є часто використовуваним протоколом для передачі файлів. Він раніше був основним засобом, хоча зараз HTTP, мабуть, є більш поширеним.
ChrisInEdmonton

FTP використовує по суті ту саму конструкцію, хоча мені доведеться шукати специфіку, перш ніж я спробую реалізувати код, який її використовує.
Френк Томас

1

Це можна вирішити за допомогою постійного файлу cookie , не плутати його з файлом cookie сеансу, або ви можете використовувати [Viewstate], якщо сайт створений на ASP.NET, однак це не є хорошою практикою. Френк Томас має найкращу відповідь.


1
Я не впевнений, чому цю відповідь було скасовано, тому я її відхилив.
Рамхаунд

@FrankThomas, я щойно підтвердив деякі факти з нашим старшим розробником, і він сказав, що ви "можете" використовувати стійкий файл cookie або viewstate, щоб зберігати інформацію про індекс масиву байтів, яка використовується для відстеження та відновлення завантаження через завантажувач на основі браузера, однак це не було хороша практика. Зазвичай для великих поновлюваних файлів, таких як продукт MS, ви завантажуєте додаток диспетчера завантажень, і воно працюватиме так, як ви сказали. Я підтримав вашу відповідь.
Джош Кемпбелл

Ця відповідь видається безглуздою. Це не проблема визначення кількості завантаженого файлу; клієнт це вже знає. Ви можете спілкуватися з сервером за допомогою файлу cookie, але є набагато кращі підходи. Параметри заголовків, GET або POST тощо. Питання полягає в тому, як відновити передачу файлів, а не як передавати інформацію серверу.
ChrisInEdmonton

ОП запитав, як це працює, і я вказав йому в бік Cookies, щоб він міг зробити подальші дослідження. Існує кілька десятків різних способів, як розробник міг зробити резюме завантажувача. Я зробив би це за допомогою файлів cookie на клієнті для відстеження стану завантаження за допомогою індексу старт-стоп і використовував C # на бекенді, щоб обчислити кількість завантажених (від індексу X до індексу Y), а потім відновив з Y. Завантаження на робочий стіл менеджер робить те саме, тільки він зберігає свою інформацію у текстовому файлі чи базі даних. Це не stackoverflow, я не пишу вихідний код.
Джош Кемпбелл

@JoshCampbell, проблема полягає в тому, що ваше рішення працюватиме лише для людей, які використовують ваше певне клієнтське програмне забезпечення та серверне програмне забезпечення. Існують стандартні способи вирішення цієї проблеми, як зазначає Франк у своїй відповіді, і немає необхідності в кодовому коді. Крім того, ваша відповідь не вказує на процес, завдяки якому деякі сайти дозволяють ОП відновити завантаження, і тому не відповідає на питання. Ось чому я прокоментував.
ChrisInEdmonton
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.