Как написать собственный Zend-валидатор для проверки хеша файла по записи в базе данных - PullRequest
0 голосов
/ 27 февраля 2012

Я создаю хранилище файлов, где с каждым файлом связана запись базы данных. В этой базе данных я включаю значение хэша sha1 для файла. Кроме того, по соображениям безопасности я переименовываю каждый файл с определенным шаблоном, поэтому не могу проверить имя файла напрямую через значение имени файла формы.

Я пытаюсь помешать людям загружать один и тот же файл дважды, поэтому я хочу создать средство проверки формы, которое принимает загружаемый файл и проверяет хеш файла по всем значениям в базе данных. Если хеш уже находится в базе данных - и, следовательно, файл уже существует - валидатор должен вернуть false. Как получить доступ к файлу из класса валидатора, чтобы я мог вычислить хеш?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Валидатор, который вы ищете, уже существует, он является частью Zend_File_Transfer , который используется Zend_Form_Element_File . Он принимает массив для проверки.

другой вариант - выполнить проверку в контроллере, потому что вы должны хешировать файл, делая это, так как валидатор формы представляет трудности.
Поэтому хешируйте файл в контроллере перед вызовом -> receive () и используйте Zend_Validate_Db_NoRecordExists. Это может быть так же легко сделать с помощью метода в вашей модели. Вы также можете использовать этот валидатор при создании метода, который хэширует файл.

Zend_File_Transfer_Adapter_Abstract API имеет метод getHash (), я думаю, вы можете вызвать getHash () и проверить его по Db_NoRecordExists.

Удачи!

1 голос
/ 27 февраля 2012

Ваш вопрос очень плохо задан.Поэтому я не буду углубляться в логику этого. Извините Вот очень простой пример того, как вы можете создать пользовательский класс проверки.

Самое важноеВы должны помнить, это два метода.

  1. isValid(): возвращает логическое значение «истина» или «ложь»
  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;
}
...