Как я могу определить, совпадают ли два файла изображения в Perl? - PullRequest
1 голос
/ 28 августа 2009

У меня есть сценарий Perl, который я написал для личного использования, который периодически извлекает файлы изображений с веб-сайта. Затем он сохраняет эти изображения в папку. Эти файлы изображений довольно часто одинаковы от выборки к выборке, и я бы не хотел сохранять дубликаты, если смогу обойти это.

Мой вопрос: как лучше сравнить / проверить, совпадают ли они?

Моя единственная реальная мысль до сих пор - открыть дескриптор файла для существующего, md5 it, md5 содержимого $ response-> из выборки и затем сравнить их. Будет ли это работать?

Есть ли лучший способ?

EDIT:

Ух ты, уже куча замечательных предложений. Поможет ли вам сказать, что этот скрипт выполняется ежедневно через cron? То есть он гарантированно работает каждый день в одно и то же время? Кроме того: я смотрю последние измененные заголовки на некоторых из них, и они не выглядят на 100% точными, то есть есть некоторые, которые имеют последние изменения более недели назад, когда я знаю, что изображение более новое чем это. Я предполагаю, что это потому, что сам файл изображения с тех пор не изменялся на сервере ... что мне не очень помогает ...

Ответы [ 5 ]

5 голосов
/ 28 августа 2009
  • Не открывайте и не хэшируйте сохраненное изображение каждый раз - храните хеш вместе с изображением, когда сохраняете его. Сравните размеры.

  • Не отправляйте GET-запрос сразу, сначала сделайте HEAD и сравните размер, дату последнего изменения и любые Etags с тем, что вы получили в прошлый раз.

3 голосов
/ 28 августа 2009

Существует несколько HTTP-заголовков, которые вы можете использовать для этого - если вы сэкономите время, которое вы в последний раз получили файл, вы можете сделать условное получение с помощью

If-Modified-Since: <date>

Или, если сервер возвращает заголовок Etag с ответом, вы можете сохранить его вместе с изображением (или коллекцией всех etags, которые вы видели для этого изображения), и выполнить:

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

Если сервер поддерживает условное получение, то вы получите ответ «304 Not Modified», без тела.

1 голос
/ 28 августа 2009

Да, это правильно. В зависимости от того, как вы получаете файл и как часто вы можете также проверять HTTP 304 Not Modified и сохранять загрузку самостоятельно.

1 голос
/ 28 августа 2009

md5 будет работать, но вам все равно придется извлекать файл Есть ли полезные метаданные в заголовках HTTP, директивах длины содержимого, управления кэшем, ETag и т. Д.?

0 голосов
/ 28 августа 2009

Для этой цели также есть хороший инструмент fdupes . Не знаю, какую систему вы используете и для каких систем инструмент может быть построен.

...