Подтверждение успешной загрузки HTTP в Python
Вопрос
Есть ли простой и надежный способ подтвердить успешное завершение загрузки из Интернета для загрузки с использованием Python или WGET [для больших файлов]?Я хочу убедиться, что файл загружен полностью, прежде чем выполнять другое действие.
Решение
Учитывая множество (на мой взгляд, большинство на практике) разделов заголовков HTTP/1.1, вы можете получить ожидаемую длину тела объекта.Если у вас есть такое ожидание, вы можете решить, получили ли вы все данные сущности.Видеть RFC 2616, раздел 4.4 для полной информации, но по сути:
- иногда
content-length
точно отражает длину тела объекта - иногда тело объекта может отсутствовать, в зависимости от кода ответа или от того, отвечает ли ответ на
HEAD
запрос - иногда запрос закодирован для передачи;и в данных HTTP есть какой-то маркер, который говорит: «Я закончил» (
Transfer-Encoding: chunked
) - а иногда сообщение официально отправляется, когда соединение закрывается (в этом случае вы не можете отличить получение всего сообщения от преждевременного отключения)
Во всех случаях, кроме последнего, вы можете сказать, есть ли у вас все это или нет.Я не знаю, дает ли какой-либо конкретный инструмент (wget или существующая библиотека Python) вам легко интерпретируемый сигнал о том, что ваш ответ был или не был усечен.
Другие советы
HTTP не предоставляет возможности это проверить.
При распространении больших файлов используется способ: после загрузки вычислить сумму md5 файла и сравнить ее с суммой md5, предоставленной сервером.
Например, именно так Ubuntu распределяет и проверяет загрузку компакт-дисков. https://help.ubuntu.com/community/HowToMD5SUM