0

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

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

4

2 回答 2

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;
}
于 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 回答