Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何编写自定义Zend验证器以根据数据库记录检查文件的哈希_File_Zend Framework_Hash_Custom Validators - Fatal编程技术网

File 如何编写自定义Zend验证器以根据数据库记录检查文件的哈希

File 如何编写自定义Zend验证器以根据数据库记录检查文件的哈希,file,zend-framework,hash,custom-validators,File,Zend Framework,Hash,Custom Validators,我正在构建一个文件存储库,其中每个文件都有一个与其关联的数据库条目。在该数据库中,我包含了文件的sha1哈希值。此外,出于安全原因,我使用特定模式重命名每个文件,因此无法通过表单的文件名值直接检查文件名 我试图阻止人们两次上传同一个文件,所以我想创建一个表单验证程序,它接受正在上传的文件,并根据数据库中的所有值检查文件的哈希值。如果散列已经在数据库中——因此文件已经存在——验证程序应该返回false。如何从validator类内部访问文件,以便计算哈希?您的问题问得很糟糕。因此,我将不深入探讨它

我正在构建一个文件存储库,其中每个文件都有一个与其关联的数据库条目。在该数据库中,我包含了文件的sha1哈希值。此外,出于安全原因,我使用特定模式重命名每个文件,因此无法通过表单的文件名值直接检查文件名


我试图阻止人们两次上传同一个文件,所以我想创建一个表单验证程序,它接受正在上传的文件,并根据数据库中的所有值检查文件的哈希值。如果散列已经在数据库中——因此文件已经存在——验证程序应该返回false。如何从validator类内部访问文件,以便计算哈希?

您的问题问得很糟糕。因此,我将不深入探讨它的逻辑。很抱歉,这里有一个非常简单的示例,说明如何创建自定义验证类

你需要记住的最重要的事情是两种方法

  • isValid()
    :通过逻辑返回true或false
  • 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;
    }
    

    您正在寻找的验证程序已经存在,它是所使用的验证程序的一部分。它接受一个数组进行验证

    另一种选择是在控制器中进行检查,因为表单验证程序存在困难,因此必须对文件进行哈希处理。
    因此,在调用->receive()之前在控制器中散列该文件,并使用Zend_Validate_Db_NoRecordExists。使用模型中的方法可能同样容易做到这一点。在创建散列文件的方法时,也可以使用此验证器

    api有一个方法getHash(),我相信您可以调用getHash()并根据Db_NoRecordExists进行验证


    祝你好运

    好的,那么让我猜个谜:如何从validator类内部获取文件的哈希值?参数$value是一个字符串。我需要访问文件本身才能计算哈希值。发送文件的位置和哈希值以代替字符串,并比较哈希值这使我更接近我要查找的内容,但不是完全。如果我没有弄错的话,这将检查文件的哈希值是否与一组特定的值匹配。我试图检查它是否与一组值不匹配。具体来说,我正在尝试查看此文件的哈希值是否与数据库中存储的任何哈希值都不对应。我编写了一个以散列作为参数的验证器。然后我转到控制器,计算散列并将验证器添加到表单的file元素中。验证器正在运行,甚至在正确的时间返回false。不幸的是,当我运行$form->isValid时,无论传递给该方法的值是什么,它似乎都没有任何效果。很明显,我遗漏了一些东西。我意识到这些都是新手的问题,但嘿,我是个新手(就像每个人都曾经做过的那样);)@blainarmstrong发布您的验证程序代码,这可能有助于发现问题。