我正在构建一个文件存储库,其中每个文件都有一个与之关联的数据库条目。在那个数据库中,我包含了文件的 sha1 哈希值。此外,出于安全原因,我使用特定模式重命名每个文件,因此我无法通过表单的文件名值直接检查文件名。
我试图阻止人们两次上传同一个文件,所以我想创建一个表单验证器,它接收正在上传的文件并根据数据库中的所有值检查文件的哈希值。如果哈希值已经在数据库中——因此文件已经存在——验证器应该返回 false。如何从验证器类内部访问文件以便计算哈希?
我正在构建一个文件存储库,其中每个文件都有一个与之关联的数据库条目。在那个数据库中,我包含了文件的 sha1 哈希值。此外,出于安全原因,我使用特定模式重命名每个文件,因此我无法通过表单的文件名值直接检查文件名。
我试图阻止人们两次上传同一个文件,所以我想创建一个表单验证器,它接收正在上传的文件并根据数据库中的所有值检查文件的哈希值。如果哈希值已经在数据库中——因此文件已经存在——验证器应该返回 false。如何从验证器类内部访问文件以便计算哈希?
你的问题问得很糟糕。所以我不会深入研究它的逻辑。抱歉这是一个非常简单的示例,说明如何创建自定义验证类。
您需要记住的最重要的事情是两种方法。
isValid()
:通过逻辑返回真或假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;
}
您正在寻找的验证器已经存在,它是Zend_Form_Element_File使用的Zend_File_Transfer的一部分。它接受一个数组来验证。
另一种选择是在控制器中进行检查,因为您必须对文件进行哈希处理,因为表单验证器存在困难。
所以在调用 ->receive() 之前在控制器中散列文件并使用 Zend_Validate_Db_NoRecordExists。使用模型中的方法可能同样容易做到这一点。您还可以在创建散列文件的方法时使用此验证器。
Zend_File_Transfer_Adapter_Abstract api 有一个方法getHash (),我相信你可以调用 getHash() 并针对 Db_NoRecordExists 进行验证。
祝你好运!