1

我有一个 Perl 脚本,我为自己的个人用途编写了一个定期从网站获取图像文件的 Perl 脚本。然后它将这些图像保存到一个文件夹中。这些图像文件在每次提取时通常是相同的,如果我能绕过它,我不想保存重复项。

我的问题:比较/检查它们是否相同的最佳方法是什么?

到目前为止,我唯一真正的想法是打开现有文件的文件句柄,md5 它,md5 $response->content 来自 fetch 然后比较它们。那行得通吗?

有没有更好的办法?

编辑:

哇,已经有很多很棒的建议了。如果我告诉你这个脚本每天都通过 cron 运行,会有帮助吗?即保证每天都在完全相同的时间运行?另外:我正在查看其中一些的最后修改的标题,它们看起来不是 100% 准确,即当我知道图像更新时,有一些最后修改的时间超过一周前比起那个来说。我假设那是因为从那时起图像文件本身就没有在服务器上被修改过......这对我没有多大帮助......

4

5 回答 5

5
  • 不要每次都打开并散列存储的图像 - 在存储图像时将散列存储在图像旁边。也比较大小。

  • 不要立即发出 GET 请求,先做一个 HEAD,然后将大小、最后修改日期和任何 Etag 与上次得到的进行比较。

于 2009-08-28T18:32:32.967 回答
3

您可以为此使用许多 HTTP 标头 - 如果您保存上次检索文件的时间,您可以使用

If-Modified-Since: <date>

或者,如果服务器返回带有响应的 Etag 标头,您可以将其与图像一起存储(或您为该图像看到的所有 etag 的集合),然后执行以下操作:

If-None-Match: <all of your etags here>

如果服务器支持条件获取,那么您将收到“304 Not Modified”响应,没有正文。

于 2009-08-28T18:33:15.790 回答
1

md5 会工作,但你仍然必须拉文件。HTTP 标头、内容长度、缓存控制指令、ETag 等中是否有任何有用的元数据?

于 2009-08-28T18:29:18.513 回答
1

是的,这听起来不错。根据您获取文件的方式和频率,您可能还能够检查 HTTP 304 Not Modified 并保存自己的下载。

于 2009-08-28T18:32:07.850 回答
0

为此,还有一个不错的fdupes工具。不知道您正在使用什么系统以及该工具可以为哪些系统构建。

于 2009-08-28T18:38:04.330 回答