【问题标题】:MD5 HASH ONLINE DELPHIMD5 哈希在线德尔福
【发布时间】:2014-11-26 03:50:05
【问题描述】:

美好的一天。 我在我的 Delphi 应用程序中使用 idhttp。

我想知道我是否有可能在线获取文件的 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"

【问题讨论】:

标签: php delphi hash


【解决方案1】:

您可以使用TIdHTTP.Head() 仅检索文件的标题而无需下载文件本身,或者您可以使用TIdHTTP.Get() 下载文件并同时获取其标题。任何一种方法都会相应地填充TIdHTTP.Response 子属性。

ETag 标头(您可以从TIdHTTP.Response.ETag 属性中读取)允许您检测服务器上的文件是否已更改。当您下载文件时,您也可以保存其ETag 值(如果提供了)。然后,您可以稍后使用该值来检查服务器端文件自上次下载后是否已更改。

HTTP 有一个用于此目的的功能,称为 Conditional GET。如果您发送带有If-None-Match 标头的GET 请求(您可以为此使用TIdHTTP.Request.CustomHeaders 属性)指定您已经拥有的ETag,则服务器可以向您发送304 Not Modified 响应,如果服务器端ETag 仍然与该值匹配,因此您知道您的文件副本是最新的,服务器不会浪费时间和带宽尝试再次发送文件。

在你的例子中。该文件还有一个Content-MD5 标头。这使您可以验证您下载的文件在下载过程中没有被修改/损坏。您可以使用TIdHTTP.Response.RawHeaders.Values['Content-MD5'] 属性读取该值,使用TIdDecoderMIME 类将值解码为字节(它是base64 编码的),并使用TIdHashMessageDigest5 类计算本地/下载文件的MD5 哈希并将其与Content-MD5 哈希值进行比较。

【讨论】:

  • 很好的解释......但我看到几乎不可能获得 Content-MD5,因为大多数可下载文件没有这个标题......然后将其返回为空 =“”(空).. .我看到的唯一可能可行但永远不会100%的方法是使用标题:ETag,Last-Modified和Content-Length ...不是100%,但有助于获取文件,因为Content-MD5 总是空的... 200个左右的文件怎么下载,最好的方法是下载文件的人,我检查它的MD5并与我存储在数据库中的一个进行比较...跨度>
  • 并非所有服务器都支持ETag。有时您只需要使用Last-Modified。即使Content-Length 也不总是使用,如果使用Transfer-Encoding: chunkedContent-Type: multipart/...(例如multipart/byterange)。使用任何可用的标头,但更糟糕的情况是,您可能只需要依赖本地文件副本的 MD5 哈希值。
【解决方案2】:

是的。 ETag 用于缓存。这个特定的使用 MD5 和时间戳,但在 PHP 文档中,您还可以找到 etags,例如 3f80f-1b6-3e1cb03b。前面看到的df0743bf13519b6c461d50fac0fa0ded 字符串是文件的MD5,其中1414635035 是文件最后修改日期的UNIX 时间戳。

this website 等站点的末尾输入数字,您会看到出现的日期等于“Last-Modified”值。

【讨论】:

  • 很好的解释,我可以理解这个标题的含义......在某些情况下:[5] => 最后修改时间:星期二,2011 年 2 月 15 日 23:40:45 GMT [6] => ETag:“cb32dac369cdcb1:0”
【解决方案3】:

您可以使用 Head 请求预先获取信息:

var
  ETag: string;

idhttp.head ('http.onedrive.com/arquive.rar');
ETag := idhttp.Response.ETag;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多