美好的一天.我在我的Delphi应用程序中使用idhttp.
我想知道我是否有可能在线获取文件的MD5哈希值:
例如
idhttp.get('http.onedrive.com/arquive.rar');
可以在下载之前返回文件的MD5 ......或者我下载之后可以检查MD5吗?
对于在PHP ...我使用get_headers返回一些enteressantes数据作为Content-MD5 ...但几乎任何文件拥有此标题...
Ex 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
)
Run Code Online (Sandbox Code Playgroud)
我可以使用这个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
哈希值进行比较.