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