0

各ファイルにデータベース エントリが関連付けられているファイル リポジトリを構築しています。そのデータベースには、ファイルの sha1 ハッシュ値を含めます。また、セキュリティ上の理由から、各ファイルの名前を特定のパターンで変更しているため、フォームのファイル名の値からファイル名を直接確認することはできません。

人々が同じファイルを 2 回アップロードするのを防ごうとしているので、アップロードされるファイルを取得し、データベース内のすべての値に対してファイルのハッシュをチェックするフォーム バリデーターを作成したいと考えています。ハッシュがすでにデータベースにある場合、つまりファイルがすでに存在する場合、バリデータは false を返す必要があります。ハッシュを計算できるように、バリデータクラス内からファイルにアクセスするにはどうすればよいですか?

4

2 に答える 2

1

あなたの質問は非常にひどく聞かれます。したがって、その論理を掘り下げることはしません。申し訳ありませんが、カスタム検証クラスを作成する方法の非常に簡単な例を次に示します。

覚えておく必要がある最も重要なことは、2 つの方法です。

  1. isValid(): ロジックを介して true または false を返します
  2. getMessages(): 無効な場合はエラー メッセージを返します。

ユーザーが管理者かどうかを比較する基本的な例を次に示します。

class CustomValidate_UserAdmin extends Zend_Validate_Abstract
{
    $admin = "username"; //I am using a static value this time
 
    protected $_messageTemplates = array(
        self::FLOAT => "'%value%' is not an admin"
    );
 
    public function isValid($value)
    {
        $this->_setValue($value);
 
        if($this -> admin == $value) {     
             return true;
        }
    }
}

今すぐ使う

$element->addValidator(new CustomValidate_UserAdmin('username'));

これは、理解するための非常に単純な例です。あなたはそれをあなたのロジックに簡単に置き換えることができると思います。

アップデート


このように検証を追加します...

$element->addValidator(new CustomValidate_Hash('file/location', $hashvaluettocompare));

検証クラスで

function isValid($location, $value) {
   if(hash_file("md5", $location)==$value) return true;
}
于 2012-02-27T05:16:55.030 に答える
1

探しているバリデータは既に存在します。それはZend_Form_Element_Fileで使用されるZend_File_Transferの一部です。検証する配列を受け入れます。

別のオプションは、コントローラーでチェックを行うことです。これは、フォームバリデーターが問題を引き起こすため、ファイルをハッシュする必要があるためです。
したがって、->receive() を呼び出す前にコントローラーでファイルをハッシュし、Zend_Validate_Db_NoRecordExists を使用します。モデルのメソッドでこれを行うのと同じくらい簡単かもしれません。ファイルをハッシュするメソッドを作成するときに、このバリデーターを使用することもできます。

Zend_File_Transfer_Adapter_Abstract API にはgetHash() メソッドがあります。getHash() を呼び出して、Db_NoRecordExists に対して検証できると思います。

幸運を!

于 2012-02-27T05:53:35.010 に答える