Добрый день.
Я использую idhttp в моем приложении Delphi.
Интересно, если это возможно, я получаю MD5 хеш файла онлайн:
например
idhttp.get (‘http.onedrive.com/arquive.rar’);
Можно ли вернуть MD5 файла перед загрузкой … или сразу после загрузки можно проверить MD5?
Ибо в php … я использую get_headers, который возвращает некоторые данные enteressantes как Content-MD5 … но почти любой файл принадлежит этому заголовку …
Пример php:
<?php $url = 'https://download3.vmware.com/software/player/file/VMware-player-6.0.4-2249910.exe';
echo '<pre>';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>Array
(
[0] => HTTP/1.0 200 OK
[Server] => Apache
[ETag] => "df0743bf13519b6c461d50fac0fa0ded:1414635035"[Content-MD5] => 3wdDvxNRm2xGHVD6wPoN7Q==
[Last-Modified] => Thu, 30 Oct 2014 02:10:35 GMT
[Accept-Ranges] => bytes
[Content-Length] => 98906456
[Date] => Tue, 25 Nov 2014 19:11:28 GMT
[Connection] => close
[Content-Disposition] => attachment; filename="VMware-player-6.0.4-2249910.exe"[Content-Type] => application/x-octet-stream
)
Я могу использовать этот заголовок ETag, чтобы увидеть, идентичен ли файл? Но как поймать это с DELPHI ??
[ETag] => «df0743bf13519b6c461d50fac0fa0ded: 1414635035»
Ты можешь использовать TIdHTTP.Head()
получить только заголовки файла, не загружая сам файл, или вы можете использовать TIdHTTP.Get()
загрузить файл и получить его заголовки одновременно. Любой метод заполняет TIdHTTP.Response
подсвойства соответственно.
ETag
заголовок (который вы можете прочитать из TIdHTTP.Response.ETag
свойство) позволяет определить, был ли файл изменен на сервере. Когда вы загружаете файл, вы можете сохранить его ETag
значение также, если один был предоставлен. Затем вы можете использовать это значение позже, чтобы проверить, был ли файл на стороне сервера изменен с момента последней загрузки.
HTTP имеет функцию для этой цели под названием Условный GET. Если вы отправите GET
запрос с If-None-Match
заголовок (вы можете использовать TIdHTTP.Request.CustomHeaders
свойство для этого) с указанием ETag
у вас уже есть, сервер может отправить вам 304 Not Modified
ответ, если на стороне сервера ETag
по-прежнему соответствует этому значению, поэтому вы знаете, что ваша копия файла обновлена, и сервер не тратит время и трафик, пытаясь отправить файл снова.
В вашем примере. файл также имеет Content-MD5
заголовок. Это позволяет вам убедиться, что загружаемый вами файл не был изменен / поврежден в процессе загрузки. Вы можете использовать TIdHTTP.Response.RawHeaders.Values['Content-MD5']
свойство, чтобы прочитать это значение, используйте TIdDecoderMIME
класс для декодирования значения в байты (он закодирован в base64) и использование TIdHashMessageDigest5
класс для вычисления MD5-хэша вашего локального / загруженного файла и сравнения его с Content-MD5
хэш.
Да. ETag используются для кеширования. Этот конкретный использует MD5 и метку времени, но в документации PHP вы также можете найти etags, такие как 3f80f-1b6-3e1cb03b
, df0743bf13519b6c461d50fac0fa0ded
строка, которую вы видите впереди, является MD5 файла, где 1414635035
UNIX-метка даты последней модификации файла.
Введите номер в конце на сайте, например, этот сайт и вы увидите, что дата выхода равна значению «Last-Modified».
Вы можете использовать запрос Главы, чтобы получить информацию заранее:
var
ETag: string;
idhttp.head ('http.onedrive.com/arquive.rar');
ETag := idhttp.Response.ETag;