如何判断Perl中的两个图像文件是否相同?

时间:2009-08-28 18:27:07

标签: perl image http-headers checksum

我有一个Perl脚本,我为自己的个人用途编写,定期从网站上获取图像文件。然后它将这些图像保存到文件夹中。从fetch到fetch,这些图像文件通常是相同的,如果我可以解决它,我不想保存重复项。

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

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

有更好的方法吗?

编辑:

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

5 个答案:

答案 0 :(得分:5)

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

  • 不要立即发出GET请求,首先执行HEAD并将大小,上次修改日期和任何Etags与上次获得的内容进行比较。

答案 1 :(得分:3)

您可以使用许多HTTP标头 - 如果您节省上次检索文件的时间,则可以使用

进行条件获取
If-Modified-Since: <date>

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

是的,这是正确的。 取决于您获取文件的方式以及您可以检查HTTP 304 Not Modified的频率,并自行保存下载。

答案 4 :(得分:0)

还有一个很好的fdupes工具。不知道您正在使用什么系统以及可以为其构建工具的系统。