2009-08-28 13 views
1

私は自分の個人的な使用のためにWebサイトから画像ファイルを定期的に取得するために書いたPerlスクリプトを持っています。次に、これらのイメージをフォルダに保存します。これらのイメージファイルは、フェッチからフェッチまでかなり頻繁に同じものです。私はそれを回避することができれば、重複を保存しないでください。2つのイメージファイルが同じであるかどうかを確認する方法はありますか?

私の質問:同じものかどうかを比較/確認するにはどうすればよいでしょうか?

私の唯一の本当の考え方は、ファイルハンドルを既存のものにオープンすること、md5はmd5をフェッチして$ response-> contentをmd5して比較することです。それは働くだろうか?

良い方法がありますか?

編集:

うわー、すでにたくさんの素晴らしい提案があります。このスクリプトがcronで毎日実行されていると伝えれば助けになりますか?私。それは毎日全く同じ時刻に常に実行されることが保証されていますか?また、私は最後に変更されたヘッダーをいくつか見ていますが、100%正確ではありません。つまり、イメージがもっと最近のものであることがわかってから1週間以上前に最後に変更されたものがあります。それよりも。それ以来、画像ファイルそのものがサーバー上で変更されていないので、それは私にはそれほど助けにはならないと思っています...

答えて

5
  • 開いておらず、保存された画像を毎回ハッシュ - あなたはそれを格納する際、画像と一緒にハッシュを隠しておきます。サイズも比較する。

  • 直ちにGETリクエストを発行しないでください。最初にHEADを実行し、サイズ、最終更新日、およびすべてのEtagsを前回のものと比較してください。

+0

これはまだ実装されていませんが、私がそれをプレイするほど、これが正しいソリューションであることが分かります。最後の実行のヘッダー情報を保存し、この実行情報と比較してフェッチするかどうかを判断します。助けてくれてありがとう。 – Morinar

1

md5は動作しますが、ファイル。 HTTPヘッダー、コンテンツ長、キャッシュ制御指令、ETagなどに有用なメタデータはありますか?

+1

残念ながら。ファイルをプルすることは本当に問題ではありませんが、私のHDをdupsでいっぱいにしたくありません。 – Morinar

+0

恥。私は、ファイル全体をハッシュするよりも最適化されたものが必要な場合は、最初のn KBを読み込んで比較できると思っていたでしょう。まともなn値を見つけるためには、おそらく実験をしなければならないでしょう。 – cms

+0

ここで私はこれらをさらに詳しく見ています。私はetagsとcontent-lengthを持っています。私はあらゆる事例で考える*。 – Morinar

1

これは正しいといえます。 ファイルをどのように取得しているか、どのくらいの頻度でHTTP 304 Not Modifiedをチェックしてダウンロードを保存することができるかによって異なります。

3

は、あなたがこのために使用できるHTTPヘッダの数があります - あなたは最後のファイルを検索し、時間を節約する場合は、

If-Modified-Since: <date> 

あるいは、もし条件付きGETを行うことができますサーバが応答でのEtagヘッダを返し、あなたがイメージ、(あるいはあなたがそのイメージのために見ているのetagsのすべてのコレクション)とそれを格納し、実行することができます。

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

サーバは条件付きサポートしている場合取得、次によ体のない「304 Not Modified」レスポンスが表示されます。

0

また、便利なfdupesツールがあります。どのシステムを使用しているのか、そのツールをどのようなシステムで構築できるのか分かりません。

関連する問題