2012-02-27 5 views
0

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

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

ответ

1

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

Самое важное, что вам нужно запомнить, это два метода.

  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; 
} 
+0

Хорошо, тогда загадка мне это: Как получить хэш-значение для файла из класса валидатора? Параметр $ value - это строка. Мне нужно получить доступ к самому файлу, чтобы вычислить хэш. – blainarmstrong

+0

Отправьте местоположение файла и значение хеш вместо строки и сравните значения хэша – Starx

+0

@blainarmstrong, Проверьте обновление – Starx

1

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

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

У api есть метод getHash(), я считаю, что вы можете вызвать getHash() и проверить на Db_NoRecordExists.

Удачи!

+0

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

+0

ОК, теперь это странно. Я написал валидатор, который принимает хэш как параметр. Затем я пошел к контроллеру, вычислил хэш и добавил валидатор к элементу файла формы. Валидатор работает и даже возвращает false в нужное время. К сожалению, это не имеет никакого эффекта, когда я запускаю $ form-> isValid, независимо от того, какие значения передаются методу. Я, очевидно, что-то пропустил. Я понимаю, что это вопросы новичков, но, эй, я новичок (поскольку все были в тот или иной момент);) – blainarmstrong

+0

@blainarmstrong опубликуйте свой код валидатора, это может помочь найти проблему. – RockyFord

 Смежные вопросы

  • Нет связанных вопросов^_^