美好的一天。我在我的Delphi应用程序中使用idhttp。
我想知道是否有可能在线获取文件的 MD5 哈希:
例如
idhttp.get ( ' http.onedrive.com/arquive.rar ');
可以在下载之前返回文件的MD5...或者就在我下载后可以检查MD5
?对于在 php 中...我使用get_headers,它将一些输入数据作为内容 - 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 标头查看文件是否相同?但是如何用德尔福抓住它呢?
[ETag] => "df0743bf13519b6c461d50fac0fa0ded: 1414635035"
TIdHTTP.Head()
仅检索文件的标头,而无需下载文件本身,也可以使用TIdHTTP.Get()
下载文件并同时获取其标头。 这两种方法都会相应地填充TIdHTTP.Response
子属性。
ETag
标头(可以从 TIdHTTP.Response.ETag
属性读取)允许您检测服务器上的文件是否已更改。 下载文件时,也可以保存其ETag
值(如果已提供)。 然后,您可以稍后使用该值来检查自上次下载服务器端文件以来是否已更改。
HTTP有一个用于此目的的功能,称为条件GET。 如果发送带有 If-None-Match
标头(可以使用 TIdHTTP.Request.CustomHeaders
属性)的 GET
请求,指定已有ETag
,则服务器端ETag
仍与该值匹配时,服务器可以向您发送304 Not Modified
响应,因此您知道文件的副本是最新的,并且服务器不会浪费时间和带宽尝试再次发送文件。
在您的示例中,该文件还具有 Content-MD5
标头。 这允许您验证您下载的文件在下载过程中是否未被修改/损坏。 可以使用 TIdHTTP.Response.RawHeaders.Values['Content-MD5']
属性读取该值,使用 TIdDecoderMIME
类将值解码为字节(它是 base64 编码的),并使用 TIdHashMessageDigest5
类计算本地/下载文件的 MD5 哈希并将其与Content-MD5
哈希进行比较。
是的。ETag 用于缓存。这个特定的使用MD5和时间戳,但是在PHP文档中,您还可以找到诸如 3f80f-1b6-3e1cb03b
之类的etag。您前面看到的df0743bf13519b6c461d50fac0fa0ded
字符串是文件的 MD5,其中1414635035
是文件上次修改日期的 UNIX 时间戳。
在诸如此网站之类的网站上输入末尾的数字,您将看到发布的日期等于"上次修改时间"值。
您可以使用 Head 请求预先获取信息:
var
ETag: string;
idhttp.head ('http.onedrive.com/arquive.rar');
ETag := idhttp.Response.ETag;