6

Я пытаюсь загрузить большой файл с помощью Chrome для Mac. Интернет здесь пятнистый. Иногда интернет отключается, или мне нужно приостановить загрузку.

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

Итак, действительно ли работает функция "паузы"? Эти сторонние менеджеры закачек работают?

3 ответа3

10

Итак, действительно ли работает функция "паузы"?

Да, обычно так и есть.

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

Если размер запрашиваемого файла известен, в заголовке HTTP отображается "Длина содержимого" для вашего браузера.

Например, я пытаюсь загрузить файл PDF, и вот ответ:

charon:~ werner$ curl -I www.ready.gov/business/_downloads/sampleplan.pdf
HTTP/1.1 200 OK
Server: Apache
ETag: "230b73353fc7715f06267967df11be04:1241094925"
Last-Modified: Wed, 29 Apr 2009 20:56:46 GMT
Accept-Ranges: bytes
Content-Length: 293125
Content-Type: application/pdf
Date: Wed, 07 Sep 2011 14:49:33 GMT
Connection: keep-alive

В этом важны поля Content-Length и Accept-Ranges .

  • Accept-Ranges означает, что вы можете получить доступ к файлу по частям, если это необходимо
  • Content-Length сообщает вам весь размер файла

Теперь, когда вы начнете загрузку, ваш браузер загрузит файл как обычно, но он, конечно, также будет отслеживать загруженные байты и сохранять все во временном файле. Если вы затем нажмете "Пауза", соединение будет просто прервано.

Однако, поскольку браузер знает количество загруженных байтов, при нажатии кнопки "возобновить" он может запросить, чтобы загрузка файла была продолжена именно в этой точке с полем HTTP Range . Это все объясняется в определениях полей заголовка HTTP 1.1:

HTTP-запросы поиска с использованием условных или безусловных методов GET МОГУТ запрашивать один или несколько поддиапазонов объекта, а не весь объект, используя заголовок запроса Range, который применяется к объекту, возвращенному в результате запроса.


Хитрость заключается в том, что когда ваше соединение подвержено ошибкам, Chrome может не осознавать, что произошла потеря соединения, поэтому записать неправильное количество загруженных байтов или даже не восстановить соединение с сервером. Я не знаю , о Chrome внутренностей сделать это, но это может быть не в состоянии возобновить загрузку , если он не может отправить успешный запрос HTTP.

Согласно этому ответу, Chrome теоретически может считать загрузку завершенной, даже если TCP-соединение было закрыто / прервано вручную. Это объяснило бы «кажется, что оно работает», которое вы описали.

Кроме того, некоторые серверы могут не поддерживать команду Range , хотя я думаю, что это редко. Некоторые сайты, такие как Rapidshare, не позволяют возобновить некоторые загрузки.

Наконец, вы можете рассмотреть возможность использования менеджера загрузки и посмотреть, решит ли это ваши проблемы. Кроме этого, использование BitTorrent для загрузки файлов, если это возможно, является, вероятно, более безопасным вариантом, чем обычная загрузка по HTTP.

1

Итак, действительно ли работает функция "паузы"?

Нет, это не работает в Google Chrome. (Хорошо, кнопка «Пауза» работает, но выглядит так, как будто внутренняя часть Google Chrome никогда не прекращает загрузку файла, когда вы нажимаете кнопку «Пауза»). Кнопка, кажется, ничего не делает вообще. Это можно увидеть, когда интернет-соединение потеряно. Это ломает Google Chrome и браузер не может возобновить).

Для тестирования я написал простую веб-страницу, которая позволяет загружать файлы, а также поддерживает возобновление загрузки. Тестируя приостановленную загрузку с помощью Google Chrome, я обнаружил, что на самом деле браузер позволяет мне нажимать "Пауза" во время текущей передачи, однако нажатие "Возобновить" не отправляет ни одного запроса HTTP (диапазона).

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

Что касается сторонних менеджеров загрузки, я понятия не имею, наверняка найдутся такие, которые смогут приостановить и возобновить загрузку HTTP.

1

Я лично использую wget и много завиваюсь.

$ wget -c website.com/file.zip

Затем, если соединение завершится, просто запустите ту же команду еще раз, и оно продолжится с того места, где оно было прервано. Если wget автоматически не завершает работу с ошибкой соединения, ^ C, и используйте стрелки вверх и просто запустите команду, пока она не закончит загрузку. Вы можете установить его в цикле и запускать команду снова и снова [с задержкой], пока она не выдаст 0 код выхода [Success].

curl тоже очень хорош, я часто предпочитаю curl, а не wget, но wget обычно проще, если вы не знаете, что делаете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .