Итак, действительно ли работает функция «паузы»?
Да, обычно так и есть.
Это работает следующим образом: всякий раз, когда вы загружаете файл, вы отправляете 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
говорит вам весь размер файла
Теперь, когда вы начнете загрузку, ваш браузер загрузит файл как обычно, но он, конечно, также будет отслеживать загруженные байты и сохранять все во временном файле. Если вы затем нажмете «Пауза», соединение будет просто прервано.
Однако, поскольку браузер знает количество загруженных байтов, при нажатии кнопки «возобновить» он может запросить продолжение загрузки файла именно в этот момент с Range
полем HTTP . Это все объясняется в определениях полей заголовка HTTP 1.1 :
HTTP-запросы на получение с использованием условных или безусловных методов GET МОГУТ запрашивать один или несколько поддиапазонов объекта , а не весь объект, используя заголовок запроса Range, который применяется к объекту, возвращенному в результате запроса.
Хитрость заключается в том, что когда ваше соединение подвержено ошибкам, Chrome может не осознавать, что произошла потеря соединения, поэтому записать неверное количество загруженных байтов или даже не возобновить соединение с сервером. Я не знаю , о Chrome внутренностей сделать это, но это может не быть в состоянии возобновить загрузку , если он не может отправить успешный запрос HTTP.
Согласно этому ответу , Chrome теоретически может считать загрузку завершенной, даже если TCP-соединение было закрыто / прервано вручную. Это объяснило бы «кажется, что оно работает», которое вы описали.
Кроме того, некоторые серверы могут не поддерживать Range
команду, хотя я думаю, что это редко. Некоторые сайты, такие как Rapidshare, не позволяют возобновить некоторые загрузки.
Наконец, вы можете рассмотреть возможность использования менеджера загрузки и посмотреть, решит ли это ваши проблемы. Кроме этого, использование BitTorrent для загрузки файлов, если это возможно, является, вероятно, более безопасным вариантом, чем обычная загрузка HTTP.
Я лично использую wget и много завиваюсь.
$ wget -c website.com/file.zip
Затем, если соединение завершится, просто запустите ту же команду еще раз, и оно продолжится с того места, где оно было прервано. Если wget автоматически не завершает работу с ошибкой соединения, ^ C, и используйте стрелки вверх и просто запустите команду до завершения загрузки. Вы можете установить его в цикле и запускать команду снова и снова [с задержкой], пока она не выдаст 0 код выхода [Success].
curl тоже очень хорош, я часто предпочитаю curl, а не wget, но wget обычно проще, если вы не знаете, что делаете.
источник